_expand
變更記憶體區塊的大小。
語法
void *_expand(
void *memblock,
size_t size
);
參數
memblock
先前配置之記憶體區塊的指標。
size
新的大小 (以位元組計)。
傳回值
_expand
會傳回重新配置記憶體區塊的 void 指標。 _expand
與不同的 realloc
是,無法移動區塊來變更其大小。 因此,如果有足夠的記憶體可供擴充區塊而不移動它,則 memblock
_expand
參數會與傳回值相同。
在其作業期間偵測到錯誤時,_expand
會傳回 NULL
。 例如,如果 _expand
是用來收縮記憶體區塊,它可能會偵測到小型區塊堆積的損毀,或無效的區塊指標,並傳回 NULL
。
如果沒有足夠的記憶體可以展開區塊而不移動它,則函式會傳 NULL
回 。 _expand
絕不會傳回大小小於要求的展開區塊。 如果失敗,errno
會指出失敗類別。 如需 的詳細資訊errno
,請參閱errno
、 _doserrno
_sys_errlist
和 _sys_nerr
。
傳回值會指向適合儲存任何類型的物件的儲存空間。 若要檢查項目的新大小,請使用 _msize
。 若要取得 void
以外之類型的指標,請對傳回值使用類型轉換。
備註
_expand
函式會嘗試展開或收縮區塊,變更先前配置的記憶體區塊大小,不用移動自己在堆積中的位置。 memblock
參數會指向區塊的開頭。 size
參數會指定區塊的新大小,以位元組為單位。 區塊內容在不超過新的和舊的大小範圍內不會變更。 memblock
不應該是已釋放的區塊。
注意
在 64 位元的平台中,如果新的大小小於目前的大小,_expand
可能不收縮區塊;但若因為區塊的大小小於 16 K,而配置在低分散堆積中,_expand
就不會變更區塊,並傳回 memblock
。
當應用程式與 C 執行時間連結庫的偵錯版本連結時, _expand
會解析為 _expand_dbg
。 如需如何在偵錯程式期間管理堆積的詳細資訊,請參閱 CRT偵錯堆積。
這個函式會驗證它的參數。 如果 memblock
為 Null 指標,則此函式會叫用無效的參數處理程式,如參數驗證中所述。 若允許繼續執行, errno
會設為 EINVAL
,且函式會傳回 NULL
中所述。 如果 size
大於 _HEAP_MAXREQ
, errno
則設定為 ENOMEM
,且函式會傳 NULL
回 。
根據預設,此函式的全域狀態會限定於應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態。
需求
函式 | 必要的標頭 |
---|---|
_expand |
<malloc.h> |
如需相容性詳細資訊,請參閱相容性。
範例
// 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