Share via


_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_MAXREQerrno 則設定為 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

另請參閱

記憶體配置
calloc
free
malloc
_msize
realloc