Realloc导致堆腐败

时间:2014-02-27 09:23:57

标签: c memory-management

我正在尝试在C中编写代码,我面临realloc的问题。代码在某些时候工作正常,但在另一时间重新分配期间崩溃并出现Heap Corruption错误。 我已经粘贴了将数据填充到其中的结构和函数。任何人都可以告诉我,如果我在这里做错了什么。

typedef struct MyDataStructureStr
{
    MyDataStructureStr()
    {
        val1 = -1;
        val2 = -1;
    }

    int val1;
    int val2;
} MyDataStructureStr, *MyDataStructurePtr;

typedef struct MyStructureStr
{
    MyStructureStr()
    {
        connector = NULL;
        counter   = 0;
    }

    MyDataStructurePtr connector;
    int                counter;
}MyStructureStr, *MyStructurePtr;

static void storeData(int first, int second)
{
    if(myStruct->connector == 0)
        myStruct->connector = (MyDataStructurePtr)malloc(sizeof(MyDataStructureStr);
    else
        myStruct->connector = (MyDataStructurePtr)realloc(myStruct->connector, sizeof(MyDataStructureStr) * (myStruct->counter + 1));

    myStruct->connector[myStruct->counter].val1 = first;
    myStruct->connector[myStruct->counter].val2 = second;
    myStruct->counter++;
}

欢迎任何建议。 提前致谢

1 个答案:

答案 0 :(得分:5)

几点。

  1. 您不需要执行if(myStruct->connector == 0)事情。如果传递realloc指针,NULL将分配内存。根据手册页:如果ptrNULL,则对于所有大小为的值,该调用等同于malloc(size)

  2. 您的typedef struct函数是合法的,但您应该注意它们没有被调用。

  3. 我看不到counter被初始化为零或connectorNULL的位置。这可能是因为您没有粘贴整个程序。

  4. 我认为实际问题是您正在分配counter的{​​{1}}数据结构。如果我理解你在做什么,这应该是sizeof(MyStructureStr)。这可能是堆损坏的原因,但如果没有完整的程序,则很难说清楚。

  5. 程序中的其他内容(您尚未粘贴)可能会破坏堆。

  6. sizeof(MyDataStructureStr)是调试此类问题的最佳方法