从C中的文件中读取链表

时间:2013-12-18 00:24:07

标签: 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,point,point...,int,point,point... int表示要添加到多边形的点数。

一个例子:如果* poly在第二个fread()之前(initPoly()之后)是0x8000,则在第二个fread()之后它变为其他值,即使我将数据读取到&amp; p 450 我一直在调试这个过去一小时仍然没有出现......

The issue

4 个答案:

答案 0 :(得分:2)

这是错误的:

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)个字节的数据,所以这不会超出界限。

你也没有释放你在这里分配的内存,但内存泄漏是一个完全独立的问题。

答案 1 :(得分:1)

p被声明为指针。因此,在&p调用中使用fread将不会读入p指向的内存,而是更改p指针本身。它会导致内存溢出,导致您的numofverticei变量(以及可能更多)被删除,并在p中存储无效的内存地址。只需fread进入p而不进入&p

fread(p, sizeof(Point), 1, file);

答案 2 :(得分:0)

您可以只使用堆栈变量

,而不是为p使用动态内存分配
Point p;

然后第二个fread将有效

fread(&p,sizeof(Point),1,file);

您可能还需要更改为

addNVertex(poly, &p, i+1);

答案 3 :(得分:0)

好的,我放弃了,所以我做了一个解决方法。我按字段编写字段,然后malloc()多边形,然后逐字段读取并填充多边形。