0

次のプログラムで割り当てられたメモリを解放しようとしています:

include <stdio.h>
#include <stdlib.h>

void main(int argc, char** argv) {
  int* x = (int *) malloc(4 * sizeof(int));
  int i;

  for(i = 0; i < 4; i++) {
   x[i] = i;
   printf("X[%d] = %d\n", i, x[i]);
  }

   x = (int *) realloc(x, 4 * sizeof(int));

   for(i = 0; i < 8; i++) {
     x[i] = i;
     printf("X[%d] = %d\n", i, x[i]);
//   free(x[i]);
   }

  free(x);
}

次のメッセージが表示されます: libC 中止エラー: * glibc が検出されました./a.out: free(): 無効な次のサイズ (高速): 0x00000000014f8010 * *

最後のループ内で解放しようとしましたが、それでも問題が発生します。どこが間違っていますか?

4

1 に答える 1

1

realloc() は、割り当てられたメモリを指定された量だけ増やしません。要求されたバイト数を正確に再割り当てします。したがって、配列のサイズを 8 つの整数の長さに変更する場合は、次のようにする必要があります。

x = realloc(x, 8 * sizeof(int));

ところで、C で malloc() と realloc() の戻り値をキャストしないでください。

http://c-faq.com/malloc/mallocnocast.html

于 2013-02-19T01:46:31.783 に答える