重新配置記憶體區塊。
語法
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