_expand
更新 : 2007 年 11 月
メモリ ブロックのサイズを変更します。
void *_expand(
void *memblock,
size_t size
);
パラメータ
memblock
事前に割り当てられているメモリ ブロックへのポインタ。size
新しいサイズ (バイト単位)。
戻り値
_expand は、再割り当てされたメモリ ブロックへの void ポインタを返します。_expand は、realloc とは異なり、ブロックの移動によるサイズの変更はできません。そのため、ブロックを移動せずに拡張できるだけの十分なメモリがある場合、_expand の memblock パラメータは戻り値と同じになります。
_expand は、処理中にエラーが検出されると NULL を返します。たとえば、_expand を使用してメモリ ブロックを縮小すると、_expand は、小さいブロック ヒープの破損や無効なブロック ポインタを検出し、NULL を返す場合があります。
使用できるメモリが十分になく、移動しないとブロックを指定したサイズに拡張できない場合、関数は NULL を返します。_expand は、要求したよりも小さいサイズに拡張されたブロックを返しません。エラーが発生すると、errno はエラーの性質を示します。errno の詳細については、「errno、_doserrno、_sys_errlist、および _sys_nerr」を参照してください。
戻り値が指すメモリ領域は、どの型のオブジェクトを格納する場合でも、適切にアライメントされます。メモリ ブロックの新しいサイズを確認するには、_msize を使用します。void 以外の型へのポインタを得るには、戻り値に型キャストを行います。
解説
_expand 関数は、事前に割り当てられたメモリ ブロックのサイズを変更するために、ヒープ内のブロックの位置を移動せずにそのブロックを拡張または縮小します。パラメータ memblock は、ブロックの始めを指します。パラメータ size では、ブロックの新しいサイズをバイト単位で指定します。ブロックの内容は、新しいサイズと古いサイズのうち小さい方のサイズまでは変更されません。memblock には、解放されたブロックを指定しないでください。
メモ : |
---|
64 ビット プラットフォームでは、新しいサイズが現在のサイズよりも小さい場合、_expand はブロックを縮小しないことがあります。特に、ブロック サイズが 16K 未満で、そのブロックが Low Fragmentation Heap に割り当てられた場合、_expand はブロック サイズを変更せず、memblock を返します。 |
アプリケーションが C ランタイム ライブラリのデバッグ バージョンとリンクされている場合、_expand は _expand_dbg に解決されます。デバッグ中のヒープの処理方法の詳細については、「CRT デバッグ ヒープ」を参照してください。
この関数は、パラメータを検証します。memblock が null ポインタの場合、「パラメータの検証」に説明されているように、この関数は無効なパラメータ ハンドラを呼び出します。実行の継続が許可された場合、errno が EINVAL に設定され、関数から NULL が返されます。sizeが _HEAP_MAXREQ より大きい場合、errno は ENOMEM に設定され、関数は NULL を返します。
必要条件
関数 |
必須ヘッダー |
---|---|
_expand |
<malloc.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// 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
.NET Framework の相当するアイテム
適用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。