使用 fgetc() 时出现分段错误。我该如何解决?

I'am getting a Segmentation fault while using fgetc(). How can I fix it?

我想从文件流中读取 z 字节。然后我想返回一个 char 数组中的值。如果您能给我一个解释,我将不胜感激。那是我现在的代码:

char * getData(FILE * fp, long * x)
{
  int z = 0;
  char * data = malloc(sizeof(char) * BUFFLENGTH);
  strcpy(data,"");

  while(z < BUFFLENGTH-2)
  {
    if(feof(fp) == 0)
    {
      data[z] = fgetc(fp);
      z++;
      x++;
    }
    else
    {
       strcat(data,"[=10=]");
       return data;
    }
  }    
}

我知道触发分段错误抛出了这一行:

data[z] = fgetc(fp);

但我不知道为什么。

  • 您应该检查是否分配成功。
  • 您应该在 调用 fgetc() 而不是使用 feof().
  • 之后检查读取是否成功
  • 如果从文件中读取了一个或多个字节并且没有读取其值为零的字节,因为指针指向不是空终止字符串的东西将被传递给 strcat() 并且它将访问通过 malloc() 分配的区域而不是初始化。取而代之的是,您应该通过添加 '[=16=]'.
  • 来终止字符串
  • 即使读取的长度超过限制,您也应该 return 显式,否则如果调用者使用 return 值,您将调用 未定义的行为 .

应用了这些建议的代码:

char * getData(FILE * fp, long * x)
{
  int z = 0;
  char * data = malloc(sizeof(char) * BUFFLENGTH);
  if(data == NULL) return NULL;
  /* strcpy() isn't needed because it will be overwritten */

  while(z < BUFFLENGTH-2)
  {
    int input = fgetc(fp);
    if(input != EOF)
    {
      data[z] = input;
      z++;
      x++;
    }
    else
    {
       data[z] = '[=10=]';
       return data;
    }
  }
  free(data);
  return NULL;
}