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;
}
}
我在我的代碼中添加了一些東西,我忽略了這個示例,我將這個大小初始化爲0,並且在我分配someStruct之前已經分配了1個空間。所以它應該是一個有效的數組位置。 – Xantham
不,仍然不正確。你的'realloc'創建一個大小完全爲'totalSize'的數組,然後返回'totalSize'。因此,該數組在'realloc'後面確實具有'SomeStruct_Array_Size',而不是一個。 – nneonneo
哦......我明白了,所以我第一次運行循環,因爲我的初始化是不正確的(當它真的是1時說大小爲0),我剛結束重新分配我已經分配給相同大小的區域。因此,當它仍然像SomeStruct_Array [0]一樣高時,我就會寫入SomeStruct_Array [1]。我認爲這個錯誤比一個簡單的「Off by one」錯誤要高一點。 – Xantham