realloc
重新配置記憶體區塊。
語法
void *realloc(
void *memblock,
size_t size
);
參數
memblock
先前配置之記憶體區塊的指標。
size
新的大小 (以位元組計)。
傳回值
realloc
會傳回重新配置後 (且可能有移動) 記憶體區塊的 void
指標。
如果沒有足夠的可用記憶體將區塊擴充為指定的大小,原始區塊會保持不變,並 NULL
傳回。
如果 size
是零,則會釋放 memblock
所指向的區塊;傳回值是 NULL
,且 memblock
保持指向已釋放的區塊。
傳回值會指向適合儲存任何類型的物件的儲存空間。 若要取得 void
以外之類型的指標,請對傳回值使用類型轉換。
備註
注意
realloc
尚未更新以實作 C17 行為,因為新行為與 Windows 操作系統不相容。
realloc
函式會變更已配置之記憶體區塊的大小。 memblock
引數指向記憶體區塊的開頭。 如果 memblock
是 NULL
,則 realloc
的行為方式與 malloc
相同,並且會配置 size
個位元組的新區塊。 如果 memblock
不是 NULL
,它應該是先前呼叫 calloc
、 malloc
或 realloc
所傳回的指標。
size
引數會指定區塊的新大小,以位元組為單位。 區塊的內容維持為新舊大小的較短者,不過新區塊可能在不同的位置。 因為新區塊可以位於新的記憶體位置,因此不保證傳 realloc
回的指標是透過 自變數傳遞的 memblock
指標。 realloc
如果沒有緩衝區成長,則不會零新配置的記憶體。
如果記憶體配置失敗,或所要求的記憶體數量超過 _HEAP_MAXREQ
,則 realloc
會將 errno
設定為 ENOMEM
。 如您需要此錯誤碼和其他錯誤碼的相關資訊,請參閱errno
、 _doserrno
_sys_errlist
與 _sys_nerr
。
realloc
呼叫 malloc
,以便使用 C++ _set_new_mode
函式來設定新的處理程式模式。 新的處理常式模式表示失敗時,malloc
是否呼叫 _set_new_handler
所設定的新處理常式。 根據預設, malloc
不會在無法配置記憶體時呼叫新的處理程式例程。 您可以覆寫這個預設行為,因此,在 realloc
無法配置記憶體時,malloc
會呼叫新的處理常式,其方法與 new
運算子因相同原因而失敗時所執行的方法相同。 若要覆寫預設值,請及早在程式中呼叫
_set_new_mode(1);
早期的程式,或與 NEWMODE 連結。OBJ (請參閱 連結選項)。
當應用程式與 C 執行時間連結庫的偵錯版本連結時, realloc
會解析為 _realloc_dbg
。 如需如何在偵錯程式期間管理堆積的詳細資訊,請參閱 CRT偵錯堆積。
realloc
標示 __declspec(noalias)
為 和 __declspec(restrict)
,這表示保證函式不會修改全域變數,而且傳回的指標不會有別名。 如需詳細資訊,請參閱 noalias
和 restrict
。
根據預設,此函式的全域狀態會限定於應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態。
需求
常式 | 必要的標頭 |
---|---|
realloc |
<stdlib.h> 和 <malloc.h> |
如需相容性詳細資訊,請參閱相容性。
範例
// crt_realloc.c
// This program allocates a block of memory for
// buffer and then uses _msize to display the size of that
// block. Next, it uses realloc to expand the amount of
// memory used by buffer and then calls _msize again to
// display the new amount of memory allocated to buffer.
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main( void )
{
long *buffer, *oldbuffer;
size_t size;
if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL )
exit( 1 );
size = _msize( buffer );
printf_s( "Size of block after malloc of 1000 longs: %u\n", size );
// Reallocate and show new size:
oldbuffer = buffer; // save pointer in case realloc fails
if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) ))
== NULL )
{
free( oldbuffer ); // free original block
exit( 1 );
}
size = _msize( buffer );
printf_s( "Size of block after realloc of 1000 more longs: %u\n",
size );
free( buffer );
exit( 0 );
}
Size of block after malloc of 1000 longs: 4000
Size of block after realloc of 1000 more longs: 8000