c-malloc()函数崩溃



我有一个程序,从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的检查程序。您可以考虑在感兴趣的地方插入一个完整的堆检查。

相关内容

  • 没有找到相关文章

最新更新