malloc,alloc,realloc之間的相似與區別


三個函數的申明分別是:
void* realloc(void* ptr, unsigned newsize);
void* malloc(unsigned size);
void* calloc(size_t numElements, size_t sizeOfElement);
都在stdlib.h函數庫內。它們的返回值都是請求系統分配的地址,如果請求失敗就返回NULL。

malloc與calloc的區別為1塊與n塊的區別:
malloc調用形式為(類型*)malloc(size):在內存的動態存儲區中分配一塊長度為“size”字節的連續區域,返回該區域的首地址。
calloc調用形式為(類型*)calloc(n,size):在內存的動態存儲區中分配n塊長度為“size”字節的連續區域,返回首地址。
realloc調用形式為(類型*)realloc(*ptr,size):將ptr內存大小增大到size。(也可以縮小,縮小的內容消失)。

另外有一點不能直接看出的區別是,malloc 只管分配內存,並不能對所得的內存進行初始化,所以得到的一片新內存中,其值將是隨機的。calloc在動態分配完內存后,自動初始化該內存空間為零。

 

realloc有個細節需要注意:

無非就是將已經存在的一塊內存擴大。

char* p = malloc(1024);
char* q = realloc(p,2048);

現在的問題是我們應該如何處理指針 p。 剛開始按照我最直觀的理解,如果就是直接將 p = NULL;。 到最后只需要釋放 q的空間就可以了。

因為最近在做個封裝。結果在做單元測試的時候發現。有時候我在 free(q); 的時候會出錯。這樣我就郁悶了。

后來仔細一跟蹤,發現 realloc 完以后 q 和 p 的指針地址是一樣。不過有時候又不一樣。

仔細查了下資料。得到如下信息:

       1.如果 當前連續內存塊足夠 realloc 的話,只是將p所指向的空間擴大,並返回p的指針地址。 這個時候 q 和 p 指向的地址是一樣的。

       2.如果 當前連續內存塊不夠長度,再找一個足夠長的地方,分配一塊新的內存,q,並將 p指向的內容 copy到 q,返回 q。並將p所指向的內存空間刪除。

這樣也就是說 realloc 有時候會產生一個新的內存地址 有的時候不會。所以在分配完成后。我們需要判斷下 p 是否等於 q。並做相應的處理。

這里有點要注意的是要避免 p = realloc(p,2048); 這種寫法。有可能會造成 realloc 分配失敗后,p原先所指向的內存地址丟失。

 

 

上段摘自:http://blog.csdn.net/snlying/article/details/4005238

很好的博客。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM