realloc

重新配置記憶體區塊。

語法

void *realloc(
   void *memblock,
   size_t size
);

參數

memblock
先前配置之記憶體區塊的指標。

size
新的大小 (以位元組計)。

傳回值

realloc 會傳回重新配置後 (且可能有移動) 記憶體區塊的 void 指標。

如果沒有足夠的可用記憶體將區塊擴充為指定的大小,原始區塊會保持不變,並 NULL 傳回。

如果 size 是零,則會釋放 memblock 所指向的區塊;傳回值是 NULL,且 memblock 保持指向已釋放的區塊。

傳回值會指向適合儲存任何類型的物件的儲存空間。 若要取得 void 以外之類型的指標,請對傳回值使用類型轉換。

備註

注意

realloc 尚未更新以實作 C17 行為,因為新行為與 Windows 作業系統不相容。

realloc 函式會變更已配置之記憶體區塊的大小。 memblock 引數指向記憶體區塊的開頭。 如果 memblockNULL,則 realloc 的行為方式與 malloc 相同,並且會配置 size 個位元組的新區塊。 如果 memblock 不是 NULL ,它應該是先前呼叫 callocmallocrealloc 所傳回的指標。

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) ,這表示保證函式不會修改全域變數,而且傳回的指標不會有別名。 如需詳細資訊,請參閱 noaliasrestrict

根據預設,此函式的全域狀態會限定于應用程式。 若要變更此行為,請參閱 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

另請參閱

記憶體配置
calloc
free
malloc