malloc()函数崩溃

时间:2014-04-13 15:33:31

标签: c pointers crash malloc

我有一个程序,我正在从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返回,指针并在提取数字后重置缓冲区,现在工作正常!

1 个答案:

答案 0 :(得分:3)

通过缓冲区溢出,使用释放的内存,使用野指针等看起来像标准内存损坏,尽管它不在显示的代码中。
malloc()只会在簿记数据结构损坏(可能)或执行错误的情况下崩溃(如果你没有自己动手,则极不可能)。

使用带有附加检查的debug_malloc或像valgrind这样的检查程序。您可以考虑在有趣的位置插入完整的堆检查。