名前空間
変種
操作

realloc

提供: cppreference.com
< c‎ | memory
ヘッダ <stdlib.h> で定義
void *realloc( void *ptr, size_t new_size );

指定されたメモリ領域を再確保します。 メモリ領域は以前に malloc()calloc() または realloc() によって確保されていなければならず、まだ free() または realloc の呼び出しで解放されていてはなりません。 そうでなければ、結果は未定義です。

再確保は以下のいずれかによって行われます。

a) 可能であれば、 ptr の指す既存の領域を拡大または縮小します。 領域の内容は新しいサイズと古いサイズの小さい方まで変更されずに残されます。 領域が拡大される場合、配列の新しい部分の内容は未定義です。
b) サイズ new_size バイトの新しいメモリブロックを確保し、新しいサイズと古いサイズの小さい方と同じサイズのメモリ領域をコピーし、古いブロックを解放します。

十分なメモリがない場合、古いブロックは解放されず、ヌルポインタが返されます。

ptr がヌルポインタの場合、動作は malloc(new_size) の呼び出しと同じです。

new_size がゼロの場合、動作は処理系定義です。 ヌルポインタが返されるかもしれませんし (その場合、古いメモリブロックは解放されるかもしれませんし、されないかもしれません)、記憶域にアクセスするためには使用できない何らかの非ヌルなポインタが返されるかもしれません。

realloc はスレッドセーフです。 引数を通して可視なメモリ位置にのみアクセスし、いかなる静的記憶域にもアクセスしないかのように振舞います。

メモリ領域を解放する free または realloc の以前の呼び出しは、同じメモリ領域またはその一部を確保する realloc を含むあらゆる確保関数の呼び出しに対して同期します。 この同期は解放関数によるそのメモリに対するいかなるアクセスよりも後でかつ 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 int
    if(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 size
    if(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 array
        free(pb);
    } else { // if realloc failed, the original pointer needs to be freed
        free(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

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.22.3.5 The realloc function (p: 349)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.20.3.4 The realloc function (p: 314)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.10.3.4 The realloc function

[編集] 関連項目