1

我正在尝试用 C 编写一个流编辑器,但我很难处理字符串。在读取文件的行后,我想将它们本地存储在字符串数组中。但是,当我尝试将变量存储temp到字符串数组中时,StoredEdits出现segmentation fault (core dumped)错误。此外,如果我取消注释该char* temp2变量并将其保存到我的数组中作为一种解决方法,那么最后一个读入的值将存储为数组中的每个值。

我认为这与 temp2 是一个指针这一事实有关。在每次迭代后,我已经尝试了一百万种方法,例如 malloc'ing 和 free'ing 这个变量,但似乎没有任何效果。

任何帮助将不胜感激。

      #define MAX_SIZE 100 
      typedef char String[MAX_SIZE];   
          int main(int argc, char* argv[]){
              char** StoredEdits;                                                                                                                                                                    
              int index, numOfEdits;
              FILE *EditFile;                                                                                                                                                                                       
              char* temp;
              //char* temp2;                                                                                                                                                                                            

              StoredEdits = (char**)malloc(MAX_INPUT_SIZE*sizeof(String));                                                                                                                                           

              /*Check to see that edit file is passed in.*/
              if(argc < 2){
                printf("ERROR: Edit File not given\n");
                return(EXIT_FAILURE);
              }

              printf("%s\n",argv[1]);

              if( (EditFile = fopen(argv[1],"r")) != NULL ){
                printf("file opened\n");
                numOfEdits = 0;
                while(fgets(temp, MAX_STRING_SIZE, EditFile) != NULL){
                  printf("%d %s",numOfEdits,temp);
                  //temp2 = temp;                                                                                                                                                                                       
                  StoredEdits[numOfEdits++] = temp;
                  //StoredEdits[numOfEdits++] = temp;
                  printf("Stored successfully\n");
                }

..........

              printf("%d\n",numOfEdits);
              for(index=0;index<numOfEdits;index++){
                printf("%d %s\n",index, StoredEdits[index]);
              }
4

3 回答 3

4

您需要初始化 temp 以指向有效的存储。

temp = malloc(MAX_STRING_SIZE+1);

看起来你可能打算做这样的事情:

String temp;

使用你的宏。这作为一个常规的 char 数组会更好。通用名称是buffer

char buffer[MAX_STRING_SIZE+1];

然后,你应该在你的数组中存储,而不是temp它本身,而是一个包含内容副本的新字符串。这里有一个 POSIX 函数strdup应该会有所帮助。注意,strdup它不是 C 标准的一部分,但在大多数托管实现中都可用。从历史上看,它来自 BSD 分支。

StoredEdits[numOfEdits++] = strdup(temp);

让我稍微退后一步说,如果你在循环temp 内部strdup分配新的存储空间,那么你应该跳过这个,因为正如 Jim Balter 所说,这会泄漏内存。如果您temp在循环之外进行分配,那么无论您是静态分配(通过声明 a char [])还是动态分配(使用malloc)都没有什么区别。


顺便说一句,这条线不会让你买太多:

typedef char String[MAX_SIZE];

有关原因,请参阅经典的 Kernighan(K&R 中的K 文章为什么Pascal 不是我最喜欢的编程语言


另请注意,我上面的示例不检查malloc. malloc可能会失败。当malloc失败时,它将返回一个 NULL 指针。如果您尝试通过此指针存储数据,Kaboom!

于 2013-04-08T05:46:14.173 回答
3

由于指针语义,您的问题是正确的。您应该使用从 temp 复制字符串的内容。

char *cpy = malloc(1 + strlen(temp));
if (cpy)
    strcpy(cpy, temp);
//else handle error
StoredEdits[numOfEdits++] = cpy;
于 2013-04-08T05:40:52.727 回答
0

其他人回答了错误的原因。

但是从程序中,我看到你试图分配一个字符双数组。然后将从文件中读取的每一行存储到数组中。

StoredEdits = (char**)malloc(MAX_INPUT_SIZE*sizeof(String));

如果我的假设是正确的,那么您应该将数组传递给 strcpy,如下所示。

strcpy(StoredEdits[numOfEdits],tmp);

当您有一个每行大小不同的文件时,最好将指针数组指向字符数组。

于 2013-04-08T10:08:56.117 回答