c-读取多个文本文件(或执行两次?)时,请与Free()发行



在读取多个文件时,我在代码的某个部分方面遇到了麻烦。这是其中的大部分:

    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); 

该代码的这一部分仅以上一行独有的行读取。但是,当我有多个参数并且此代码经过两次时,我会遇到双免费或损坏错误,我认为这是因为免费(线(完成了两次。

代码中的其他地方我应该移动它,或者可以用?

我可以替换它。

根据getline()文档:

如果 *linePtr为null,则getline((将分配一个用于存储该行的缓冲区,该缓冲区应由用户程序释放。

在您的情况下, line仅对第一个文件而言是无效的。对getline()的调用设置line,以指向释放的东西。

下一次围绕line的值不再为空,而是指向不应写入的释放位置,然后在以前被释放的相同价值上再次调用免费位置。

释放后将line设置回NULL应该解决您的问题。

free(line);
line = NULL;

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

最新更新