衆所周知,realloc()
的做用就是將已經 malloc 的內存塊,從新擴展加長。當你並無使用高端的內存池的時候,臨時從堆中申請加大內存,這是頗有用的。可是如何正確地使用 realloc() 呢?html
realloc 用法程序員
#include <stdlib.h> void *realloc(void *ptr, size_t size);
傳入參數:
(1)須要被擴展大小的內存指針
(2)擴展後的大小(注意不是添加的大小)函數
返回參數:
新的指針ui
長篇大論放後面,咱們先上代碼:spa
uint8_t *pMemToBeRealloc = malloc(1024); size_t memSize = 1024; ... /* start realloc */ uint8_t *pMemBackup = pMemToBeRealloc; /* 將 realloc 以前的內存地址備份一下 */ pMemToBeRealloc = realloc(pMemToBeRealloc, 2048); if (pMemToBeRealloc) { /* realloc 成功 */ LOG_DEBUG("Memory had been extent to 2048."); pMemBackup = NULL; memSize = 2048; } else { /* realloc 失敗了,這個時候返回的是 NULL */ LOG_ERROR("Oh no, realloc() failed: %s.", strerror(errno)); pMemToBeRealloc = pMemBackup; memSize = 1024; } ...
當 realloc()
返回 NULL 的時候,表示內存擴展動做失敗了。但這個時候,原來的內存並無被釋放
,因此有必要把原來的內存預先備份下來。至於失敗的時候要怎麼處理,那就是程序員本身的事情了,這沒有標準方案。指針
當 realloc()
返回非零值時呢,表示realloc是成功的。此時不論返回值是多少,程序都不須要對原來的內存地址值做特殊操做
。code
爲何這麼說呢?主要是參考資料裏面沒有把一個問題說清楚:htm
pMemToBeRealloc == pMemBackup
的狀況,那說明只是在原來的內存基礎上日後擴展就行了,這是最簡單的狀況pMemToBeRealloc != pMemBackup
呢?這很容易讓人誤解爲,須要調用一次 free(pMemBackup)。這是錯誤的,由於這個動做,realloc 會自動幫你作了,不要多此一舉!BTW
,我的還建議注意一個地方:從 man 手冊上面看,雖然對於 malloc() 返回的內存,大部分標準庫會初始化爲全零,可是對於 realloc() 擴展的部分,則不必定。
不過保險起見,應該是對於 malloc() 和 realloc() 返回的內存內容,都不要相信它們都已經被初始化爲0
纔好。blog