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