1

在读取多个文件时,我的代码的某些部分有问题。这是其中的大部分内容:

    char *a;
    int ch;
    char *line = NULL;
    char *prev_line[999];
    size_t len = 0;
    size_t read;
    if (argc > 1)
    {
      int i = 1;
      FILE *fp;
      while (i < argc)
      {
          a = malloc (MAX_NAME_SZ * sizeof (char));
          fp = fopen (argv[i], "r");
          if (fp == NULL)
          {
              /*Error statement in case an file doesn't exist */
          }
          else
          {
              while ((read = getline(&line, &len, fp)) != -1) {
                  if (strncmp(line, prev_line, read) != 0) {
                      strncat(a, line, read);
                      strncpy(prev_line, line, read);          
                  }
              }
              free(line); 

              fclose (fp);
              changeCase (a);
              printf ("\n");

          }
          i++;            
      }  
   }
   else
   {
       a = malloc (MAX_NAME_SZ * sizeof (char));
       fgets (a, MAX_NAME_SZ, stdin);
       changeCase (a);
       printf ("\n");
    }
}

但我的问题包括这部分。

while ((read = getline(&line, &len, fp)) != -1) {
    if (strncmp(line, prev_line, read) != 0) {
        strncat(a, line, read);
        strncpy(prev_line, line, read);          
    }
}
free(line); 

这部分代码只读取前一行独有的行。但是,当我有多个参数并且此代码经过两次时,我会得到一个双重释放或损坏错误,我认为这是因为 free(line) 执行了两次。

代码中是否还有其他地方我应该移动它,或者我可以用它替换它?

4

1 回答 1

0

根据getline()文档

如果 *lineptr 为 NULL,则 getline() 将分配一个缓冲区来存储该行,该缓冲区应由用户程序释放。

在您的情况下line,第一个文件只会为空。getline()对集合的调用line指向然后被释放的东西。

下一次周围的值line不再为空,而是指向一个不应写入的已释放位置,然后对先前释放的相同值再次调用 free。

line释放后重新设置NULL应该可以解决您的问题。

free(line);
line = NULL;

这应该会导致getline()为每个正在读取的文件分配新的内存。

于 2018-04-30T05:47:18.423 回答