我想从文件流中读取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);


但是我不知道为什么。

最佳答案

您应该检查分配是否成功。
您应该在调用fgetc()而不是使用feof()之后检查读取是否成功。
如果从文件中读取一个或多个字节并且没有读取其值为零的字节,则使用strcat()会引起未定义的行为,因为指向非空终止字符串的指针将被传递给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;
}

关于c - 使用fgetc()时出现段错误。我该如何解决?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35815215/

10-11 23:12
查看更多