c - 从C中的文件中读取链表

标签 c file pointers linked-list fread

我应该从文件中读取这个指针链接列表。 问题是,每当调用 fread() 时,它不仅会更改指针 *p,还会更改 *poly,然后导致 addNVertex() 使程序崩溃。读取多边形方法:

Polygon* readPolygon(FILE *file){
    Polygon *poly=initPoly();
    Point p;
    int numofvertice,i;
    fread(&numofvertice,sizeof(int),1,file);
    for(i=0;i<numofvertice;i++){
        fread(&p,sizeof(Point),1,file);
        addNVertex(poly,&p,i+1);
    }
    return poly;
}

这是一个二进制文件,如下所示: 整数,点,点...,整数,点,点... int 表示要添加到多边形的点数。

示例:如果 *poly 在第二个 fread() 之前(在 initPoly() 之后)为 0x8000,则在第二个 fread() 之后> 即使我将数据读取到 &p,它也会更改为其他值??? 我在过去的一个小时里一直在调试这个问题,但仍然没有任何结果......

The issue

最佳答案

这是错误的:

Point *p=(Point*)malloc(sizeof(Point));
...
fread(&p,sizeof(Point),1,file);

调用fread从文件中读取数据并将其存储在指针p占用的内存中。 p 是堆栈上的局部变量,大小可能为 4 或 8 字节,具体取决于程序的位数。但是您正在读取 sizeof(Point) 字节;如果 Point 大于指针,则会因缓冲区溢出而破坏堆栈。

你真的想写这个:

//    V-- No "&" here
fread(p,sizeof(Point),1,file);

这会将文件数据读入指向p的内存,而不是指针对象p本身。由于您实际上有 sizeof(Point) 字节的数据,因此这不会超出范围。

您也无法释放在此处分配的内存,但内存泄漏是一个完全独立的问题。

关于c - 从C中的文件中读取链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20647423/

相关文章:

c - 指向C中有10个元素的数组中的第11个元素

无法与 Linux 上的 Lua 库链接

c - 如何在所有原始整数大小都相同的系统上检测字节顺序?

python - 上下文无关文法区分整数和浮点常量

php - 从文本文件中删除空行

php - $_FILES 数组在未上传任何内容时不为空

c - 没有硬 float 的 ARM Docker 交叉编译

java - 如何在 tomcat web 应用程序中锁定文件?

C 指向数组的指针示例停止工作

c - 在 C 中使用结构和指针时出现段错误