2014-02-27 128 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