我有一个程序,我正在从txt-File中读取数据。 它基本上是每行中的一个(固定在第一行)整数。
示例:
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-Pointer并将此指针传递给另一个函数:
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-call中发生了故障(而不是检查返回的指针的有效性)。 如果我更改我调用initTerm的代码的顺序,我就可以达到Term~300,对于某些编译也是如此 - 例如-O3或-pg(我正在使用gcc-Compiler),更改正确的调用次数。
我已经发现,如果另外分配的头部被破坏,则malloc()崩溃,通常是由多线程引起的。由于我的程序在每行代码中都是完全单线程的,我想知道,我能做什么,阅读整个文件(目前710条款,可能增长到几个MegaByte)
修改 谢谢你的帮助,我找到了问题所在。 你是关于malloc的正确 - 失败只是一个症状,因为我刚刚意识到我用来从文件中获取行的缓冲区从未重置过,因此开始在我的RAM中的任何地方四处游荡。复制地址,malloc返回,指针并在提取数字后重置缓冲区,现在工作正常!
答案 0 :(得分:3)
通过缓冲区溢出,使用释放的内存,使用野指针等看起来像标准内存损坏,尽管它不在显示的代码中。
malloc()
只会在簿记数据结构损坏(可能)或执行错误的情况下崩溃(如果你没有自己动手,则极不可能)。
使用带有附加检查的debug_malloc或像valgrind这样的检查程序。您可以考虑在有趣的位置插入完整的堆检查。