メモリ ブロックのサイズを変更します。
構文
void *_expand(
void *memblock,
size_t size
);
パラメーター
memblock
以前に割り当てられていたメモリ ブロックへのポインター。
size
新しいサイズ (バイト単位)。
戻り値
_expand は再割り当て済みのメモリ ブロックに void ポインターを返します。 _expandreallocとは異なり、ブロックを移動してそのサイズを変更することはできません。 したがって、ブロックを移動せずに拡張できる十分なメモリがある場合、_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