realloc
ヘッダ <stdlib.h> で定義 | ||
void*realloc(void*ptr, size_t new_size ); | ||
指定されたメモリ領域を再確保します。 メモリ領域は以前に malloc()、 calloc() または realloc()
によって確保されていなければならず、まだ free() または realloc
の呼び出しで解放されていてはなりません。 そうでなければ、結果は未定義です。
再確保は以下のいずれかによって行われます。
ptr
の指す既存の領域を拡大または縮小します。 領域の内容は新しいサイズと古いサイズの小さい方まで変更されずに残されます。 領域が拡大される場合、配列の新しい部分の内容は未定義です。new_size
バイトの新しいメモリブロックを確保し、新しいサイズと古いサイズの小さい方と同じサイズのメモリ領域をコピーし、古いブロックを解放します。十分なメモリがない場合、古いブロックは解放されず、ヌルポインタが返されます。
ptr
がヌルポインタの場合、動作は malloc(new_size
) の呼び出しと同じです。
new_size
がゼロの場合、動作は処理系定義です。 ヌルポインタが返されるかもしれませんし (その場合、古いメモリブロックは解放されるかもしれませんし、されないかもしれません)、記憶域にアクセスするためには使用できない何らかの非ヌルなポインタが返されるかもしれません。
メモリ領域を解放する free または realloc の以前の呼び出しは、同じメモリ領域またはその一部を確保する | (C11以上) |
目次 |
[編集]引数
ptr | - | 再確保するメモリ領域を指すポインタ |
new_size | - | 配列のバイト単位の新しいサイズ |
[編集]戻り値
成功した場合は、新たに確保されたメモリの先頭を指すポインタを返します。 メモリリークを回避するためには、返されたポインタは free() または realloc()
で解放しなければなりません。 元のポインタ ptr
は無効化され、それに対するあらゆるアクセスは未定義動作になります (再確保がその場で行われた場合でも)。
失敗した場合は、ヌルポインタを返します。 元のポインタ ptr
は有効なまま残され、 free() または realloc()
で解放する必要があるかもしれません。
[編集]ノート
サイズゼロに対するサポートは C11 DR 40 で非推奨になりました。
元々 (C89 で)、サイズゼロに対するサポートは以下のようなコードに対応するために追加されました。
OBJ *p =calloc(0, sizeof(OBJ));// "zero-length" placeholder ... while(1){ p = realloc(p, c *sizeof(OBJ));// reallocations until size settles ... // code that may change c or break out of loop}
[編集]例
#include <stdio.h>#include <stdlib.h> int main(void){int*pa =malloc(10*sizeof*pa);// allocate an array of 10 intif(pa){printf("%zu bytes allocated. Storing ints: ", 10*sizeof(int));for(int n =0; n <10;++n)printf("%d ", pa[n]= n);} int*pb = realloc(pa, 1000000*sizeof*pb);// reallocate array to a larger sizeif(pb){printf("\n%zu bytes allocated, first 10 ints are: ", 1000000*sizeof(int));for(int n =0; n <10;++n)printf("%d ", pb[n]);// show the arrayfree(pb);}else{// if realloc failed, the original pointer needs to be freedfree(pa);}}
出力:
40 bytes allocated. Storing ints: 0 1 2 3 4 5 6 7 8 9 4000000 bytes allocated, first 10 ints are: 0 1 2 3 4 5 6 7 8 9