簡體   English   中英

在c中使用realloc

[英]using realloc in c

我正在使用void *realloc(void *pointer, size_t size); 增加指針的大小。 realloc是如何工作的?
它是否創建了一個nre地址空間,並將舊值復制到新的地址空間並返回一個指針這個地址? 或者它只是分配更多的內存並將其綁定到舊內存?

@Iraklis有正確的答案:第二個(如果它可以逃脫它)或第一個(但只有它必須)。

但是,有時它既不能做也會失敗。 注意:如果無法調整數據大小,它將返回NULL ,但內存不會 free d。 像這樣的代碼是錯誤的:

ptr = realloc(ptr, size);

如果realloc返回NULL ,那么舊的ptr將永遠不會被free因為你已經用NULL覆蓋了它。 要做到這一點,你必須做到:

void *tmp = realloc(ptr, size);
if(tmp) ptr = tmp;
else /* handle error, often with: */ free(ptr);

在BSD系統上,上面的內容變成了一個名為reallocf的庫函數,可以按如下方式實現:

void *reallocf(void *p, size_t s)
{
    void *tmp = realloc(p, s);
    if(tmp) return tmp;
    free(p);
    return NULL;
}

允許您安全使用:

ptr = reallocf(ptr, size);

請注意,如果realloc必須分配新的空間和復制舊的數據,它 free舊的數據。 只有在無法調整大小的情況下,如果調整大小失敗是可恢復的錯誤,它會使數據保持不變。

這取決於! 如果它無法調整內存區域的大小,那么它會分配一個新的記憶區域,復制舊數據並釋放舊內存。

你濫用“地址空間”一詞。 進程的所有內存都存在於單個地址空間中。 程序未使用的內存,其全局變量及其堆棧稱為“堆”。 mallocrealloc (以及calloc ,它只是malloc和clear)從堆中分配內存。 realloc大多數實現將檢查是否有足夠的( size字節)空閑空間從pointer開始(必須指向先前由mallocrealloc分配的塊 - realloc知道該塊有多大),如果是,則只增加在pointer和返回給定的位置分配的塊的大小,沒有復制。 如果沒有足夠的空間,它將相當於newptr = malloc(size); memcpy(newptr, pointer, size_of_old_block); free(pointer); return newptr; newptr = malloc(size); memcpy(newptr, pointer, size_of_old_block); free(pointer); return newptr; ...也就是說,它會分配一個足夠大的塊來保存size字節,將數據復制到pointer該塊的pointer ,釋放舊塊,並返回新塊的地址。

我認為答案是函數取決於請求的大小和可用堆。

從程序員的角度來看,我認為我們得到保證的是,如果新分配成功, pointer將為非null。 因此,指針可以保持不變,即使它現在指向由size_t表示的更大的存儲器塊。

Realloc不會改變指針的大小,指針的大小在同一架構上總是相同的。 它會更改指針指向的已分配內存的大小。 它的工作方式如下所述: http//msdn.microsoft.com/en-us/library/xbebcx7d.aspx 簡而言之,是的,它會分配更多的內存,讓你的內容保持不變; 如果必須移動內存,則復制內容。 當然,您可以指定較短的大小,在這種情況下,它會修剪分配的內存,同樣保持內容不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM