3

私のコードの一部は、テキスト ファイルから不明な行数を読み取り、その行を構造体 (tempSomeStruct) に解析し、S​​omeStruct_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;
   }
}
4

1 に答える 1

1

新しい配列のサイズはで、すぐに配列の末尾の 1 つ後ろSomeStruct_Array_Sizeに書き込みます。SomeStruct_Array[SomeStruct_Array_Size]C 配列のインデックスは 0 であることに注意してください。

使用する

SomeStruct_Array[SomeStruct_Array_Size-1] = tempSomeStruct;

代わりは。

于 2013-02-06T23:52:33.830 に答える