記憶體操作函式 realloc

2021-06-25 08:44:24 字數 2415 閱讀 6903

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

標頭檔案:stdlib.h和malloc.h

功能: 

先判斷當前的指標是否有足夠的連續空間,如果有,擴大mem_address指向的位址,並且將mem_address返回,如果空間不夠,先按照newsize指定的大小分配空間,將原有資料從頭到尾拷貝到新分配的記憶體區域,而後釋放原來mem_address所指記憶體區域(注意:原來指標是自動釋放,不需要使用free),同時返回新分配的記憶體區域的首位址。即重新分配儲存器塊的位址。

返回值: 如果重新分配成功則返回指向被分配記憶體的

指標,否則返回空指標null。

注意:新的大小一定要大於原來的大小,不然的話會導致資料丟失。

不考慮資料內容,新的大小可大可小。

當記憶體不再使用時,應使用

free

()函式將記憶體塊釋放。

#include#includeint main()

記憶體分配:『

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

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

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

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

老塊被放回堆上。

例如:1

2

3

4

5

6

7

8

9

#include

voidmain()

在這段程式中我們增加了

指標q,用它記錄了原來的

記憶體位址p。這段程式可以編譯通過,但在執行到a行時,如果原有記憶體後面沒有足夠空間將原有空間擴充套件成乙個連續的新大小的話,

realloc函式就會以第二種方式分配記憶體,此時資料發生了移動,那麼所記錄的原來的

記憶體位址q所指向的記憶體空間實際上已經放回到堆上了!這樣就會產生q

指標的指標懸掛,即指標指向了一塊沒有分配給使用者使用的記憶體,如果再用q指標進行操作就可能發生意想不到的問題。所以在應用

realloc函式是應當格外注意這種情況。

返回值:

返回的是乙個void型別的

指標:呼叫成功。(這就要求在你需要的時候進行

強制型別轉換)

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

free(游離)」的了。

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

特殊情況:

如果mem_address為null,則realloc()和

malloc()類似。分配乙個newsize的記憶體塊,返回乙個指向該記憶體塊的

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

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

使用總結:

1. realloc失敗的時候,返回null

2. realloc失敗的時候,原來的記憶體不改變,不會釋放也不會移動

3. 假如原來的記憶體後面還有足夠多剩餘記憶體的話,realloc的記憶體=原來的記憶體+剩餘記憶體,realloc還是返回原來記憶體的位址; 假如原來的記憶體後面沒有足夠多剩餘記憶體的話,realloc將申請新的記憶體,然後把原來的記憶體資料拷貝到新記憶體裡,原來的記憶體將被

free掉,realloc返回新記憶體的位址

4. 如果size為0,效果等同於

free()。這裡需要注意的是只對

指標本身進行釋放,例如對二維指標**a,對a呼叫realloc時只會釋放一維,使用時謹防

記憶體洩露。

5. 傳遞給realloc的

指標必須是先前通過

malloc(), 

calloc(), 或realloc()分配的

6.傳遞給realloc的

指標可以為空,等同於

malloc。

realloc函式,記憶體再分配

realloc是c庫提供的函式,用於動態分配新的記憶體位址,其原型是 void realloc void ptr,size t size ptr 由malloc,calloc或realloc分配的位址 size 需要申請記憶體大小,單位為byte 當ptr null時,realloc作用和mallo...

realloc函 realloc函式用法

realloc 用過很多次了。無非就是將已經存在的一塊記憶體擴大。char p malloc 1024 char q realloc p,2048 現在的問題是我們應該如何處理指標 p。剛開始按照我最直觀的理解,如果就是直接將 p null 到最後只需要釋放 q的空間就可以了。因為最近在做個封裝。結...

realloc函 realloc函式使用規則

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