2014-02-27 130 views
2

我想在C编写一个代码,我面临的问题是realloc。该代码在某个时间点工作正常,但在另一次realloc期间崩溃并出现堆损坏错误。 我已经粘贴了填充数据的结构和函数。任何人都可以告诉我,如果我在这里做错了什么。Realloc导致堆损坏

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++; 
} 

欢迎任何建议。 在此先感谢

+6

你混合C和C++的最好办法,C有没有构造函数。请记住,当您使用malloc分配存储时,您的构造函数不会被调用。确保myStruct-> counter和myStruct->连接器得到初始化,并确保在执行realloc()时它们具有适当的值 – nos

+0

对我来说看起来像合法C.这不是在C++存在之前如何在C中做对象吗?显然构造函数等将需要手动调用。 – abligh

+0

@MichaelFoukarakis今天早上没有足够的咖啡。我错过了'构造函数'在typedef中的事实,并没有手动的'this'参数等。Apols。 – abligh

回答

5

几点。

  1. 你不需要做if(myStruct->connector == 0)的事情。如果传递了NULL指针,则realloc将分配内存。根据手册页:如果ptrNULL,则对于所有尺寸为'的值,该呼叫相当于malloc(size)'。

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

  3. 我看不到counter正在初始化为零或connectorNULL。这可能是因为你没有粘贴整个程序。

  4. 我认为实际的问题是您正在分配counter数据结构sizeof(MyStructureStr)。如果我明白你在做什么,这应该是sizeof(MyDataStructureStr)。这可能是堆腐败的原因,但没有完整的程序很难说。

  5. 程序中还有其他东西(你没有粘贴)可能会破坏堆。

  6. valgrind是调试此类问题

+1

这就是为什么当你创建代表性测试用例时,'Foo'和'Bar'比'MyStructureStrType'和'MyStructureTypeStr'和'MyTypedDataStructure'更好的名字... –

+0

感谢Abligh的建议。还有另一个函数创建结构的实例,并且在相同的函数中,我正在初始化计数器和连接器。我正在使用MyDataStructureStr进行分配,并且输入的错误是我纠正了它。 – user3359601