realloc函式的使用

2021-08-30 12:15:50 字數 1460 閱讀 1973

原型:extern void *realloc(void *mem_address, unsigned int newsize);

用法:#include 有些編譯器需要#include

功能:改變mem_address所指記憶體區域的大小為newsize長度。

說明:如果重新分配成功則返回指向被分配記憶體的指標,否則返回空指標null。

當記憶體不再使用時,應使用free()函式將記憶體塊釋放。

注意:這裡原始記憶體中的資料還是保持不變的。

舉例:

// realloc.c

#include

#include

main()

詳細說明及注意要點:

1、如果有足夠空間用於擴大mem_address指向的記憶體塊,則分配額外記憶體,並返回mem_address

這裡說的是「擴大」,我們知道,realloc是從堆上分配記憶體的,當擴大一塊記憶體空間時, realloc()試圖直接從堆上現存的資料後面的那些位元組中獲得附加的位元組,如果能夠滿足,自然天下太平。也就是說,如果原先的記憶體大小後面還有足夠的空閒空間用來分配,加上原來的空間大小= newsize。那麼就ok。得到的是一塊連續的記憶體。

2、如果原先的記憶體大小後面沒有足夠的空閒空間用來分配,那麼從堆中另外找一塊newsize大小的記憶體。

並把原來大小記憶體空間中的內容複製到newsize中。返回新的mem_address指標。(資料被移動了)。

老塊被放回堆上。

例如:#include

char *p,*q;

p = (char * ) malloc (10);

q=p;

p = (char * ) realloc (p,20);

…………………………

這段程式也許在編譯器中沒有辦法通過,因為編譯器可能會為我們消除一些隱患!在這裡我們只是增加了乙個記錄原來記憶體位址的指標q,然後記錄了原來的記憶體位址p,如果不幸的話,資料發生了移動,那麼所記錄的原來的記憶體位址q所指向的記憶體空間實際上已經放回到堆上了!這樣一來,我們應該終於意識到問題的所在和可怕了吧!

3、返回情況

返回的是乙個void型別的指標,呼叫成功。(這就再你需要的時候進行強制型別轉換)

返回null,當需要擴充套件的大小(第二個引數)為0並且第乙個引數不為null,此時原記憶體變成了「freed(游離)」的了。

返回null,當沒有足夠的空間可供擴充套件的時候,此時,原記憶體空間的大小維持不變。

4、特殊情況

如果mem_address為nell,則realloc()和malloc()類似。分配乙個newsize的記憶體塊,返回乙個指向該記憶體塊的指標。

如果newsize大小為0,那麼釋放mem_address指向的記憶體,並返回null。

如果沒有足夠可用的記憶體用來完成重新分配(擴大原來的記憶體塊或者分配新的記憶體塊),則返回null.而原來的記憶體塊保持不變。

文章出處:diy部落(

realloc 函式的使用

realloc 函式的使用 include include include using namespace std void setval char tmp,int qs,int num,char mm tmp num 1 0 intmain else free q getchar getchar ...

realloc 函式的使用

realloc 函式的使用 include include include using namespace std void setval char tmp,int qs,int num,char mm tmp num 1 0 intmain else free q getchar getchar ...

realloc函 realloc函式使用規則

realloc函式使用規則如下 1 realloc失敗的時候,返回null 2 realloc失敗的時候,原來的記憶體不改變,不會釋放也不會移動 3 假如原來的記憶體後面還有足夠多剩餘記憶體的話,realloc的記憶體 原來的記憶體 剩餘記憶體,realloc還是返回原來記憶體的位址 假如原來的記憶...