gpt4 book ai didi

c - 我在使用 fgetc() 时遇到段错误。我该如何修复它?

转载 作者:行者123 更新时间:2023-11-30 21:09:04 26 4
gpt4 key购买 nike

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

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() 之后检查读取是否成功。
  • 如果从文件中读取一个或多个字节,并且没有读取其值为 0 的字节,则这种 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com