realloc
メモリ ブロックを再割り当てします。
構文
void *realloc(
void *memblock,
size_t size
);
パラメーター
memblock
以前に割り当てられていたメモリ ブロックへのポインター。
size
新しいサイズ (バイト単位)。
戻り値
realloc
は、再割り当てされた (移動された可能性もある) メモリ ブロックへの void
ポインターを返します。
ブロックを特定のサイズまで拡張するのに十分なメモリがない場合、元のブロックは変更されず、 NULL
が返されます。
size
がゼロの場合は、memblock
によってポイントされているブロックが解放されます。戻り値は NULL
で、memblock
は解放されたブロックをポイントしたままです。
戻り値は、どの型のオブジェクトのストレージの場合でも、適切に整列されたストレージ領域を指します。 void
以外の型へのポインターを取得するには、戻り値の型キャストを使用します。
解説
Note
C17 の動作は Windows オペレーティング システムと互換性がないため、realloc
は、その新しい動作を実装するように更新されていません。
realloc
関数は、割り当てられたメモリ ブロックのサイズを変更します。 memblock
引数はメモリ ブロックの先頭をポイントします。 memblock
が NULL
の場合、realloc
は malloc
と同様に動作し、size
バイトの新しいブロックを割り当てます。 memblock
がNULL
されていない場合は、calloc
、malloc
、またはrealloc
の前の呼び出しによって返されるポインターである必要があります。
size
引数は、ブロックの新しいサイズをバイト単位で指定します。 新旧のサイズのうち、小さい方のブロックの内容は変更されませんが、新しいブロックの場所は異なる場合があります。 新しいブロックは新しいメモリ位置に配置できるため、 realloc
によって返されるポインターは、 memblock
引数を介して渡されるポインターであるとは限りません。 realloc
では、バッファーの増加がある場合、新しく割り当てられたメモリは 0 になりません。
メモリの割り当てに失敗した場合、または要求されたメモリ量が _HEAP_MAXREQ
を超える場合、realloc
は errno
を ENOMEM
に設定します。 このエラー コードやその他のエラー コードについては、「errno
、_doserrno
、_sys_errlist
、および _sys_nerr
」を参照してください。
realloc
は、C++ の _set_new_mode
関数を使用して新しいハンドラー モードを設定するために malloc
を呼び出します。 新しいハンドラー モードは、エラーが発生したときに、malloc
が _set_new_handler
によって設定された新しいハンドラー ルーチンを呼び出すかどうかを指定します。 malloc
では、既定で、メモリの割り当てエラーの際に新しいハンドラー ルーチンを呼び出しません。 この既定の動作をオーバーライドすると、realloc
がメモリの割り当てに失敗したときに、malloc
演算子が同じ理由で失敗したときと同じ方法で、new
によって新しいハンドラー ルーチンを呼び出すことができます。 既定の動作をオーバーライドするには、次の関数を呼び出します。
_set_new_mode(1);
プログラムの早い段階で、または NEWMODE とリンクします。OBJ ( リンク オプションを参照)。
アプリケーションが C のランタイム ライブラリのデバッグ バージョンにリンクされている場合、realloc
は _realloc_dbg
として解決されます。 デバッグ プロセス中にヒープを管理する方法の詳細については、「 CRT デバッグ ヒープを参照してください。
realloc
が __declspec(noalias)
と __declspec(restrict)
でマークされている場合、この関数ではグローバル変数を変更せず、返されるポインターがエイリアス化されない保証があることを意味します。 詳細については、次のトピックを参照してください。 noalias
および restrict
既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。
要件
ルーチンによって返される値 | 必須ヘッダー |
---|---|
realloc |
<stdlib.h> および <malloc.h> |
互換性の詳細については、「 Compatibility」を参照してください。
例
// 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
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示