在C中动态重新分配结构数组

时间:2013-02-06 23:48:16

标签: c arrays struct realloc

我的代码的一部分将从文本文件读取未知行数,将该行解析为结构(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;
   }
}

1 个答案:

答案 0 :(得分:1)

您的新数组大小为SomeStruct_Array_Size,您立即写入SomeStruct_Array[SomeStruct_Array_Size],这是数组末尾的一个!请记住,C数组是零索引的。

使用

SomeStruct_Array[SomeStruct_Array_Size-1] = tempSomeStruct;

代替。