次の方法で共有


realloc

メモリ ブロックを再割り当てします。

構文

void *realloc(
   void *memblock,
   size_t size
);

パラメーター

memblock
以前に割り当てられていたメモリ ブロックへのポインター。

size
新しいサイズ (バイト単位)。

戻り値

realloc は、再割り当てされた (移動された可能性もある) メモリ ブロックへの void ポインターを返します。

ブロックを特定のサイズまで拡張するのに十分なメモリがない場合、元のブロックは変更されず、 NULL が返されます。

size がゼロの場合は、memblock によってポイントされているブロックが解放されます。戻り値は NULL で、memblock は解放されたブロックをポイントしたままです。

戻り値は、どの型のオブジェクトのストレージの場合でも、適切に整列されたストレージ領域を指します。 void 以外の型へのポインターを取得するには、戻り値の型キャストを使用します。

解説

Note

C17 の動作は Windows オペレーティング システムと互換性がないため、realloc は、その新しい動作を実装するように更新されていません。

realloc 関数は、割り当てられたメモリ ブロックのサイズを変更します。 memblock 引数はメモリ ブロックの先頭をポイントします。 memblockNULL の場合、reallocmalloc と同様に動作し、size バイトの新しいブロックを割り当てます。 memblockNULLされていない場合は、callocmalloc、またはreallocの前の呼び出しによって返されるポインターである必要があります。

size 引数は、ブロックの新しいサイズをバイト単位で指定します。 新旧のサイズのうち、小さい方のブロックの内容は変更されませんが、新しいブロックの場所は異なる場合があります。 新しいブロックは新しいメモリ位置に配置できるため、 realloc によって返されるポインターは、 memblock 引数を介して渡されるポインターであるとは限りません。 realloc では、バッファーの増加がある場合、新しく割り当てられたメモリは 0 になりません。

メモリの割り当てに失敗した場合、または要求されたメモリ量が _HEAP_MAXREQ を超える場合、reallocerrnoENOMEM に設定します。 このエラー コードやその他のエラー コードについては、「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

関連項目

メモリ割り当て
calloc
free
malloc