[英]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
舊的數據。 只有在無法調整大小的情況下,如果調整大小失敗是可恢復的錯誤,它會使數據保持不變。
這取決於! 如果它無法調整內存區域的大小,那么它會分配一個新的記憶區域,復制舊數據並釋放舊內存。
你濫用“地址空間”一詞。 進程的所有內存都存在於單個地址空間中。 程序未使用的內存,其全局變量及其堆棧稱為“堆”。 malloc
和realloc
(以及calloc
,它只是malloc
和clear)從堆中分配內存。 realloc
大多數實現將檢查是否有足夠的( size
字節)空閑空間從pointer
開始(必須指向先前由malloc
或realloc
分配的塊 - 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.