我在C编程中遇到了段错误,这是我的简化代码:
int read(struct frame_entry *f)
{
struct frame_entry* newptr = realloc(f, sizeof(struct frame_entry));
int ret = 0;
FILE *fp;
char ch;
while (f->len < MAX_FRAME_LEN)
{
ch = fgetc(fp);
switch(ch) {
case FRAME_END:
if (f->len){
fclose(fp);
return ret;
}
default:
f->frame[f->len++] = ch;
break;
}
}
frame_tail:
fclose(fp);
return ret;
}
运行结果为: 1,输入大小写FRAME_END 2,fclose(fp) 3,函数返回 4,继续运行但fp为零 5,ch = fgetc(fp);删除细分错误
问题是:为什么在函数返回后while循环继续运行?
最后,我发现问题在于struct frame_entry包含已打开的文件描述符,并且我使用fdopen将此文件描述符转换为文件指针,但是当我使用fclose(fp)释放此文件指针时,文件描述符也将被释放,则fgetc(fp)将导致段错误。
答案 0 :(得分:1)
这可能是由于使用了指针变量,即f
已重新分配。
realloc()
函数可能首先尝试增加指向的块的大小。但是,它可以分配一个新块,将数据(或将容纳的尽可能多的数据)复制到新块,然后释放旧块。
因此,当realloc()运行f
时,它可能指向已经取消分配的内存。您不应使用变量f
,而应使用newptr
。
此外,文件指针未正确初始化。最好检查文件指针是否正确初始化。
答案 1 :(得分:0)
我注意到的第一件事是您试图读取未在行ch = fgetc(fp);
中初始化的文件指针,其中fp没有初始化为任何有效文件。但是我同意这可能不会导致段错误。就像上面说的答案一样,您需要在调用realloc
之后使用新指针。
由于null
等于整数0
,因此循环运行,因为f->len
从未超过MAX_FRAME_LEN
。这导致循环无限运行。