我在使用fgetc()时遇到了分段错误。我该如何解决?

时间:2016-03-05 14:20:09

标签: c char segmentation-fault fgetc

我想从文件流中读取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,"\0");
       return data;
    }
  }    
}

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

data[z] = fgetc(fp);

但我不知道为什么。

1 个答案:

答案 0 :(得分:0)

  • 您应该检查分配是否成功。
  • 在调用fgetc()而不是使用feof()后,您应该检查阅读是否成功
  • strcat()的这种用法将调用未定义的行为如果从文件中读取一个或多个字节并且没有读取其值为零的字节,因为指针指向非空的-terminated字符串将传递给strcat(),它将访问通过malloc()分配但未初始化的区域。除此之外,您应该通过添加'\0'来终止字符串。
  • 即使读取的长度超过限制,您也应该明确地返回一些内容,否则如果调用者使用返回值,您将调用未定义的行为

应用了这些建议的代码:

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] = '\0';
       return data;
    }
  }
  free(data);
  return NULL;
}