我应该从文件中读取这个链接的指针列表。
问题是,每当调用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
我一直在调试这个过去一小时仍然没有出现......
答案 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
指针本身。它会导致内存溢出,导致您的numofvertice
和i
变量(以及可能更多)被删除,并在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()
多边形,然后逐字段读取并填充多边形。