1

配列にスペースを割り当てたとします

double *array;
array=malloc(100*sizeof(double));

私はいくつかのプロセスを実行し、最終的に最初の 10 個の要素はもう必要ありません。これを試してみましたrealloc:

array=realloc(array+10, 90*sizeof(double));

しかし、無効なポインター エラーが発生します。

*** glibc detected *** ./temp: realloc(): invalid pointer:...

配列を最初から縮小するにはどうすればよいですか?

4

2 に答える 2

1

読む: void* realloc (void* ptr, size_t size);:

メモリブロックの再割り当て

ptr が指すメモリ ブロックのサイズを変更します。

関数は、メモリ ブロックを新しい場所 (関数によってアドレスが返される) に移動する場合があります。

メモリ ブロックの内容は、ブロックが新しい場所に移動された場合でも、新しいサイズと古いサイズの小さい方まで保持されます。新しいサイズがより大きい場合、新しく割り当てられた部分の値は不確定です。

パラメーター:、またはで
ptr
以前に割り当てられたメモリ ブロックへのポインター。または、null ポインターの場合もあり、その場合は新しいブロックが割り当てられます (呼び出されたかのように)。 malloccallocreallocmalloc

いいえ、このような要素を再割り当てすることはできません。/関数によってrealloc返されるアドレスが必要ですmalloc()calloc()

したがって、配列から最初の 10 個の数字を削除してから、再割り当てを呼び出すことができます。

多くの実装では、縮小アクション呼び出しを介しrealloc()てヒープ内の予約サイズが変更され、メモリは移動されません。(はい、ただしメモリ管理は断片化領域を埋めるために移動する場合があります)。

于 2013-07-27T08:34:58.420 に答える