我有一个程序,从txt文件中读取数据。它基本上是(固定在第一行)每行中的整数个数。
示例:
11
1 0 0 1 0 0 0 0 0 2 0
0 0 0 0 0 0 0 1 2 0 0
0 0 0 0 0 0 3 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
我可以毫无问题地将它们读取到int指针中,并将此指针传递给另一个函数:
Term initTerm(int size, int* Exponents){
Term a = newTerm(size)
//Some code to insert the int's of the pointer into the pointer of Term
return a
}
而
typedef struct Term{
int* Exponents;
int size; //Number of ints in the Exponents-pointer
}Term;
和
Term newTerm(int size){
Term res;
res.Exponents = malloc(size*sizeof(int));
//Check for NULL
res.size = size;
return res;
}
现在问题如下:在194次完全正确地调用initTerm之后,第195次调用使程序崩溃。调试确保,故障发生在malloc调用中(不是在检查返回的指针的有效性时)。如果我更改调用initTerm的代码的顺序,我可能会达到Term~300,一些编译也是如此。标志,如-O3或-pg(我使用的是gcc编译器),会更改正确调用的次数。
我已经发现,如果额外分配的头被破坏,malloc()就会崩溃,这通常是由多线程引起的。由于我的程序在每一行代码中都是完全单线程的,我想知道,我能做些什么,来通读整个文件(目前为710条款,可能增长到几个兆字节)
编辑:谢谢你的帮助,我发现了问题。你说得对,malloc故障只是症状,因为我刚刚意识到,我用来将文件中的行放入的缓冲区从未重置,因此开始在RAM中的任何地方徘徊。malloc将地址复制到指针,并在提取数字后重置Buffer,现在工作正常!
看起来像是通过缓冲区溢出、使用释放的内存、使用野生指针等导致的标准内存损坏,尽管它不在所提供的代码中
只有当记账数据结构损坏(很可能)或实现有缺陷(如果您没有自己滚动,则极不可能)时,malloc()
才会崩溃。
使用带有附加检查的debug_malloc或类似valgrind的检查程序。您可以考虑在感兴趣的地方插入一个完整的堆检查。