realloc
更新 : 2007 年 11 月
メモリ ブロックの再割り当てを行います。
void *realloc(
void *memblock,
size_t size
);
パラメータ
memblock
事前に割り当てられているメモリ ブロックへのポインタ。size
新しいサイズ (バイト単位)。
戻り値
realloc は、再割り当て (および移動) されたメモリ ブロックへの void ポインタを返します。
指定のサイズまでブロックを拡張するだけのメモリ領域がない場合、元のブロックは変更されず、NULL が返されます。
size がゼロの場合、memblock が指すブロックは解放され、NULL が返され、memblock は解放されたブロックを指したままになります。
戻り値が指すメモリ領域は、どの型のオブジェクトを格納する場合でも、適切にアライメントされます。void 以外の型へのポインタを得るには、戻り値に型キャストを行います。
解説
realloc 関数は、既に割り当てられているメモリ ブロックのサイズを変更します。引数 memblock は、メモリ ブロックの先頭を指します。memblock が NULL の場合、realloc 関数は malloc 関数と同様に動作し、size バイトの新しいブロックを割り当てます。memblock を NULL 以外にする場合は、以前に呼び出した calloc、malloc、または realloc のいずれかの関数によって返されたポインタを渡します。
引数 size には、変更後の新しいブロックのサイズをバイト単位で指定します。ブロックの内容は、新しいサイズと古いサイズのうち小さい方のサイズまでは同じですが、新しいブロックは別の位置に割り当てられる場合があります。再割り当てされた新しいブロックは、メモリ内の別の位置に割り当てられることがあるため、realloc 関数の戻り値が、引数 memblock で渡したポインタと異なる場合があります。realloc は、バッファが拡張された場合、新たに割り当てられたメモリをゼロで初期化することはしません。
Visual C++ 2005 では、メモリ割り当てが失敗するか、または要求されたメモリ量が _HEAP_MAXREQ を超える場合、realloc は errno を ENOMEM に設定します。このエラー コードおよびその他のエラー コードの詳細については、「errno、_doserrno、_sys_errlist、および _sys_nerr」を参照してください。
reallocは malloc を呼び出し、C++ の _set_new_mode 関数を使用し、new ハンドラ モードを設定します。メモリの割り当てに失敗した場合、new ハンドラのモードに応じて、malloc 関数が _set_new_handler で設定されている new ハンドラ ルーチンを呼び出すかどうかが決まります。既定では、malloc 関数はメモリの割り当てに失敗しても new ハンドラ ルーチンを呼び出しません。既定の動作をオーバーライドすると、new 演算子がメモリの割り当てに失敗したときと同じように、realloc 関数がメモリの割り当てに失敗した場合にも、malloc 関数は new ハンドラのルーチンを呼び出すことができます。既定の動作をオーバーライドするには、プログラムの始めの方で次の関数を呼び出すか、または NEWMODE.OBJ とリンクします。
_set_new_mode(1)
「リンク オプション」を参照してください。
アプリケーションを C ランタイム ライブラリのデバッグ バージョンとリンクすると、realloc 関数は _realloc_dbg へと解決されます。デバッグ中のヒープの処理方法の詳細については、「CRT デバッグ ヒープ」を参照してください。
realloc には __declspec(noalias) と __declspec(restrict) のマークが付けられます。これは、関数がグローバル変数を変更しないことを保証し、返されるポインタがエイリアス指定されないことを意味します。詳細については、「noalias」および「restrict」を参照してください。
必要条件
ルーチン |
必須ヘッダー |
---|---|
realloc |
<stdlib.h> および <malloc.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// crt_realloc.c
// This program allocates a block of memory for
// buffer and then uses _msize to display the size of that
// block. Next, it uses realloc to expand the amount of
// memory used by buffer and then calls _msize again to
// display the new amount of memory allocated to buffer.
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main( void )
{
long *buffer, *oldbuffer;
size_t size;
if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL )
exit( 1 );
size = _msize( buffer );
printf_s( "Size of block after malloc of 1000 longs: %u\n", size );
// Reallocate and show new size:
oldbuffer = buffer; // save pointer in case realloc fails
if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) ))
== NULL )
{
free( oldbuffer ); // free original block
exit( 1 );
}
size = _msize( buffer );
printf_s( "Size of block after realloc of 1000 more longs: %u\n",
size );
free( buffer );
exit( 0 );
}
Size of block after malloc of 1000 longs: 4000
Size of block after realloc of 1000 more longs: 8000
.NET Framework の相当するアイテム
適用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。