使用return中断C

时间:2018-07-25 04:05:22

标签: c

我在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)将导致段错误。

2 个答案:

答案 0 :(得分:1)

这可能是由于使用了指针变量,即f已重新分配。 realloc()函数可能首先尝试增加指向的块的大小。但是,它可以分配一个新块,将数据(或将容纳的尽可能多的数据)复制到新块,然后释放旧块。

因此,当realloc()运行f时,它可能指向已经取消分配的内存。您不应使用变量f,而应使用newptr

此外,文件指针未正确初始化。最好检查文件指针是否正确初始化。

答案 1 :(得分:0)

我注意到的第一件事是您试图读取未在行ch = fgetc(fp);中初始化的文件指针,其中fp没有初始化为任何有效文件。但是我同意这可能不会导致段错误。就像上面说的答案一样,您需要在调用realloc之后使用新指针。

由于null等于整数0,因此循环运行,因为f->len从未超过MAX_FRAME_LEN。这导致循环无限运行。

相关问题