2013-02-06 84 views
3

我的代碼的一部分將從文本文件中讀取未知數量的行,將該行解析爲結構(tempSomeStruct),調整SomeStruct_Array的大小,然後將該tempSomeStruct添加到記憶中新開張的地方。動態地重新分配C中的結構數組

然而while循環了幾次後,我的程序停止,並說

myApplication.exe引發了斷點。

我沒有設置斷點,並做了一些挖掘,它看起來像斷點是由於從我的調用realloc堆腐敗。我對動態分配很陌生,所以當我搜索並發現了一些可能的原因時,至今沒有修復工作。

我在這種情況下如何破壞堆,以及爲避免這種情況做什麼不同?


我有這樣的功能:

int growArray(SomeStruct **SomeStruct_Array,int currentSize, int numNewElements) 
{ 
    const int totalSize = currentSize + numNewElements; 
    SomeStruct *temp = (SomeStruct*)realloc(*SomeStruct_Array,(totalSize * sizeof(SomeStruct))); 
    if (temp == NULL) 
    { 
     printf("Cannot allocate more memory.\n"); 
     return 0; 
    } 
    else 
    { 
     *SomeStruct_Array = temp; 
    } 

    return totalSize; 
} 

,它被稱爲在其他地方是這樣的:

SomeStruct* SomeStruct_Array = (SomeStruct *) calloc(1,sizeof(SomeStruct)); 
int Error_Array_Size = 0; 

if(SomeStruct_Array == NULL) 
{ 
    printf("Cannot allocate initial memory for data\n"); 
    return; 
} 

while(fgets(line,sizeof(line), file) != NULL) 
{ 
    parseTextIntoSomeStruct(line, &tempSomeStruct); 
    SomeStruct_Array_Size = growArray(&SomeStruct_Array,SomeStruct_Array_Size,1); 
    if(SomeStruct_Array_Size > 0) 
    { 
     SomeStruct_Array[SomeStruct_Array_Size] = tempSomeStruct; 
    } 
} 

回答

1

你新的數組的大小爲SomeStruct_Array_Size,你馬上記到SomeStruct_Array[SomeStruct_Array_Size]這是一個超過數組的末尾!請記住,C數組是零索引的。

使用

代替。

+0

我在我的代碼中添加了一些東西,我忽略了這個示例,我將這個大小初始化爲0,並且在我分配someStruct之前已經分配了1個空間。所以它應該是一個有效的數組位置。 – Xantham

+0

不,仍然不正確。你的'realloc'創建一個大小完全爲'totalSize'的數組,然後返回'totalSize'。因此,該數組在'realloc'後面確實具有'SomeStruct_Array_Size',而不是一個。 – nneonneo

+0

哦......我明白了,所以我第一次運行循環,因爲我的初始化是不正確的(當它真的是1時說大小爲0),我剛結束重新分配我已經分配給相同大小的區域。因此,當它仍然像SomeStruct_Array [0]一樣高時,我就會寫入SomeStruct_Array [1]。我認爲這個錯誤比一個簡單的「Off by one」錯誤要高一點。 – Xantham