_expand
メモリ ブロックのサイズを変更します。
構文
void *_expand(
void *memblock,
size_t size
);
パラメーター
memblock
以前に割り当てられていたメモリ ブロックへのポインター。
size
新しいサイズ (バイト単位)。
戻り値
_expand
は再割り当て済みのメモリ ブロックに void ポインターを返します。 _expand
realloc
とは異なり、ブロックを移動してそのサイズを変更することはできません。 したがって、ブロックを移動せずに拡張できる十分なメモリがある場合、_expand
するmemblock
パラメーターは戻り値と同じです。
_expand
は、操作中にエラーが検出された場合、NULL
を返します。 たとえば、_expand
を使用してメモリ ブロックを縮小する場合、小さなブロック ヒープ内の破損や無効なブロック ポインターが検出されると、NULL
が返されます。
ブロックを移動せずにブロックを展開するのに十分なメモリがない場合、関数は NULL
を返します。 _expand
は、拡張されたブロックが要求されたサイズに届かなかった場合、そのブロックを返しません。 エラーが発生した場合、errno
はエラーの性質を示します。 errno
の詳細については、「errno
、_doserrno
、_sys_errlist
、_sys_nerr
」を参照してください。
戻り値は、どの型のオブジェクトのストレージの場合でも、適切に整列されたストレージ領域を指します。 項目の新しいサイズを確認するには、_msize
を使用します。 void
以外の型へのポインターを取得するには、戻り値の型キャストを使用します。
解説
_expand
関数は、ヒープ内でブロックの場所を移動することなくブロックの拡張または縮小を試みることにより、以前に割り当てられたメモリ ブロックのサイズを変更します。 memblock
パラメーターはブロックの先頭を指します。 size
パラメーターはブロックの新しいサイズをバイト単位で指定します。 ブロックの内容は、新しいサイズと古いサイズのうち小さい方のサイズまでは変更されません。 memblock
は、解放されたブロックにすることはできません。
Note
64 ビット プラットフォームでは、新しいサイズが現在のサイズよりも小さい場合、_expand
はブロックを縮小しないことがあります。特に、ブロック サイズが 16K 未満で、そのブロックが Low Fragmentation Heap に割り当てられた場合、_expand
はブロック サイズを変更せず、memblock
を返します。
アプリケーションが C のランタイム ライブラリのデバッグ バージョンにリンクされている場合、_expand
は _expand_dbg
として解決されます。 デバッグ プロセス中にヒープを管理する方法の詳細については、「 CRT デバッグ ヒープを参照してください。
この関数は、パラメーターを検証します。 memblock
が null ポインターの場合、この関数は、パラメーター検証で説明されているように、無効なパラメーター ハンドラーを呼び出します。 実行の継続が許可された場合、 errno
が EINVAL
に設定され、関数が NULL
のセキュリティが強化されたバージョンです。 size
が_HEAP_MAXREQ
より大きい場合、errno
はENOMEM
に設定され、関数はNULL
を返します。
既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。
要件
機能 | 必須ヘッダー |
---|---|
_expand |
<malloc.h> |
互換性の詳細については、「 Compatibility」を参照してください。
例
// crt_expand.c
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main( void )
{
char *bufchar;
printf( "Allocate a 512 element buffer\n" );
if( (bufchar = (char *)calloc( 512, sizeof( char ) )) == NULL )
exit( 1 );
printf( "Allocated %d bytes at %Fp\n",
_msize( bufchar ), (void *)bufchar );
if( (bufchar = (char *)_expand( bufchar, 1024 )) == NULL )
printf( "Can't expand" );
else
printf( "Expanded block to %d bytes at %Fp\n",
_msize( bufchar ), (void *)bufchar );
// Free memory
free( bufchar );
exit( 0 );
}
Allocate a 512 element buffer
Allocated 512 bytes at 002C12BC
Expanded block to 1024 bytes at 002C12BC