我应该从文件中读取这个指针链接列表。
问题是,每当调用 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,它也会更改为其他值???
我在过去的一个小时里一直在调试这个问题,但仍然没有任何结果......
最佳答案
这是错误的:
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/