realloc | Programming Place Plus C言語編 標準ライブラリのリファレンス

C言語編 標準ライブラリのリファレンス realloc

先頭へ戻る

realloc関数

概要 メモリ領域を確保し直す
ヘッダ stdlib.h
形式 void* realloc(void* ptr, size_t size);
引数 ptr 動的に確保済みの領域を指すポインタ。あるいは、ヌルポインタ。
size 新しく確保する領域の大きさ。あるいは 0 を指定する(この場合は解放を意味する。「詳細」を参照)
戻り値 再確保された領域の先頭を指すポインタ。ただし、このポインタは以前確保されていてメモリ領域と同じメモリアドレスを持つ可能性はある。
メモリ不足などの要因で失敗した場合には、ヌルポインタが返される。
詳細 malloc関数calloc関数、realloc関数のいずれかで確保された領域を指定し、再度確保直す。元の領域にあった内容は、新しい領域にコピーされ、元の領域は解放される。
引数ptr をヌルポインタにした場合は、malloc関数と同じ動作になる。
引数ptr がヌルポインタでなく、引数size が 0 の場合、free関数と同じ動作になる。
確保された領域が不要になったら、free関数で解放(システムへ返却)することができる。
注意 システムがメモリ領域を管理するための追加の領域が必要なため、実際に割り当てられる大きさは、size を超える可能性がある。
引数ptr がヌルポインタでないとき、そのポインタが malloc関数calloc関数、realloc関数によって返されたポインタ(かつ、解放されていない)でない場合の動作は未定義である。
引数ptr がヌルポインタであり、かつ、引数size が 0 の場合の挙動は未定義である。
新しい領域の確保に失敗したときにはヌルポインタが返されるが、この場合、元の領域は解放されることなく残されている。そのため、「ptr = realloc( ptr, 1000 );」のように、第1引数に渡すポインタ変数を使って、戻り値を受け取ってしまうと、元の領域に対して free関数の呼び出しを行う手段が無くなってしまう可能性がある。この後の「使用例」で示すように、一旦、別の変数に受け取るべきだろう。
使用例
#include <stdio.h>
#include <stdlib.h>

#define ALLOCATE_SIZE_1ST	(5)
#define ALLOCATE_SIZE_2ND	(10)

int main(void)
{
    int* values;
    int* tmp;
    int i;

    values = malloc( sizeof(int) * ALLOCATE_SIZE_1ST );
    if( values == NULL ){
        exit( EXIT_FAILURE );
    }

    for( i = 0; i < ALLOCATE_SIZE_1ST; ++i ){
        values[i] = i;
    }

    /* 再確保 */
    tmp = realloc( values, sizeof(int) * ALLOCATE_SIZE_2ND );  /* 一旦、別の変数に受け取る */
    if( tmp == NULL ){
        /* realloc関数が失敗した場合、元の領域は解放されずに残されている */
        /* 自分で free関数を呼び出して終了する */
        free( values );
        exit( EXIT_FAILURE );
    }
    values = tmp; /* 成功したら、受け取ったメモリアドレスをコピー */
    tmp = NULL;   /* 安全策。確保された領域を指すポインタを array だけに限定する */

    for( i = ALLOCATE_SIZE_1ST; i < ALLOCATE_SIZE_2ND; ++i ){
        values[i] = i;
    }

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

    free( values );

    return 0;
}

実行結果:

0
1
2
3
4
5
6
7
8
9
関連 メモリの動的な確保に関わる標準ライブラリ関数として、他に malloc関数calloc関数がある。いずれにしても、解放は free関数で行う。
解説章 第35章


参考リンク



更新履歴

'2018/4/20 「NULL」という表記を「ヌルポインタ」に修正。

'2018/4/14 全体的に文章を見直し修正。

'2018/2/22 「サイズ」という表記について表現を統一。 型のサイズ(バイト数)を表しているところは「大きさ」、要素数を表しているところは「要素数」。

'2018/1/29 説明文について、全体的に見直した(主に、関連する関数の内容との整合性の調整)

'2018/1/22 新規作成。



標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ


このエントリーをはてなブックマークに追加
rss1.0 取得ボタン RSS