我的代码的一部分将从文本文件读取未知行数,将该行解析为结构(tempSomeStruct),调整SomeStruct_Array的大小,然后将该tempSomeStruct添加到内存中新打开的位置。
然而,经过几次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 :(得分:1)
您的新数组大小为SomeStruct_Array_Size
,您立即写入SomeStruct_Array[SomeStruct_Array_Size]
,这是数组末尾的一个!请记住,C数组是零索引的。
使用
SomeStruct_Array[SomeStruct_Array_Size-1] = tempSomeStruct;
代替。