0

このコードの何が問題になっているのかわかりません。正確に4つの値を入力すると期待どおりに機能しますが、5回目の呼び出し(scanfを要求する前)では、常に次のエラーが発生します。 *glibcが検出されました./a2:ダブルフリーまたは破損(ファストトップ):0x0916e018 * *

これが私のプログラムのコードです:

typedef struct {
  int i;
  char str[25];
} typeX;

int main(){
  int dSize = 0;
  int *dSizePtr = &dSize;
  dPointer = (typeX **)malloc(sizeof(typeX *)); // makes an array of pointers
  int i;
  for (i = 0; i < 100; i++)
    makeElement(dPointer, dSizePtr); // Puts values into those pointers
  free(dPointer);
  return 0;
}

void makeElement(dPointer **, int *dSizePtr){
  dPointer = (typeX **)realloc(dPointer, sizeof(typeX *)*(*dSizePtr+1)); // grow the array by one
  if (typeX == NULL)
    return; // some kind of quit statement, just return for now

  dPointer[*dSizePtr] = (typeX *)malloc(sizeof(typeX)); // make a new pointer in the array
  scanf("%s", dPointer[*dSizePtr]->str); // input the values of the struct (have to use scanf)
  char input[20]; 
  scanf("%s", input);
  dPointer[*dSizePtr]->int = atoi(input);

  ++(*dSizePtr);
}

dSizePtrを作成する必要はなく、&dSizeを渡すだけでよいことはわかっていますが、プログラムの現在の設定方法(これはまったく同じではなく、読みやすくするために圧縮されているだけです)、それを渡す必要があります。それ。

正直なところ、なぜこのエラーが発生するのかわかりません。私のコードを何時間も見てオンラインで読んでいて、解決策が見つかりませんでした。どんな助けでも大歓迎です!

4

2 に答える 2

1

問題は、関数がその参照ではなく、makeElementの値を取得することです。dPointerデータをrealloc取得すると、最初に割り当てられたチャンクが解放されます。ただし、スコープ外のdPointermakeElementは変更されません。

実際のメモリ割り当てがsizeof(typeX *)より大きい量で実行されるため、ランタイムエラーが遅延します。

于 2012-10-21T19:47:40.440 に答える
0

このラインはダブルフリーを引き起こしています。

dPointer = (typeX **)realloc(dPointer, sizeof(typeX *)*(*dSizePtr+1)); // grow the array by one

呼び出し元のループの最初の数回の反復では、メモリのブロックは十分に大きいため、realloc()は何もする必要がないため、渡されたのと同じポインタを返します。しかし、ある時点でメモリのブロックが小さすぎるため、realloc()は新しいメモリのブロックを割り当てて、そのブロックへのポインタを返す必要があります。その返されたポインターは、makeElement()でdPointerに割り当てられますが、呼び出し元のdPointerの値は変更されません。したがって、呼び出し元は引き続き古いdPointer値をmakeElement()に渡し、それをrealloc()に渡します。これにより、このポインターが解放されたことがわかります(配列のサイズを拡張したrealloc()の呼び出しによって)。

于 2012-10-21T20:05:20.633 に答える