1. 程式人生 > >malloc calloc realloc使用及實現原理

malloc calloc realloc使用及實現原理

malloc()

void*malloc(size_t size);

malloc 在記憶體的動態儲存區中分配一塊長度為size位元組的連續區域,size為需要的記憶體空間的長度,返回該區域的地址

calloc ( )

void*calloc(size_t nmemb, size_t size);

malloc 在記憶體的動態儲存區中分配一塊長度為nmemb(引數個數)*size(單位元素長度)位元組的連續區域,

void *realloc(void*ptr, size_t size);

realloc()是給一個已經分配了地址的指標重新分配空間,引數ptr為原有的空間地址, size是重新申請的地址空間 

區別:

malloc 不能初始化所分配的記憶體空間,需要呼叫memset bzero函式將記憶體空間初始化,如果malloc函式分配的記憶體空間原來沒有被使用過,則其中的每一位可能都是0;但,如果這部分記憶體曾經被分配過,則其中可能遺留各種各樣的資料(記憶體垃圾),也就是說,使用malloc函式的程式開始時(記憶體還沒有被重新分配)能正常進行,但經過一段時間(記憶體已經被重新分配,可能會出現一些問題)。

calloc會將所分配的空間中的每一位都初始化為零。若為字元型別或整數型別的元素分配記憶體,那麼這些元素將被初始化為0;若為指標型別的元素分配記憶體,那麼這些元素通常會被初始化為空指標;若為實型元素分配記憶體,則這些元素會被初始化為浮點型的0。

realloc可以對給定的指標所指向的空間進行擴大或縮小,原有的記憶體中的內容保持不變,但空間縮小時,則被縮小的那一部分的內容將會丟失,realloc並不保持調整後的記憶體空間和原來的 記憶體空間保持同一記憶體地址,realloc返回的指標很可能指向新的地址

malloc實現原理

將可用的記憶體連線為一個長長的連結串列(即所謂的空閒連結串列)。呼叫malloc函式時,它沿連線表尋找一個大到足以滿足使用者請求所需要的記憶體塊,然後將該記憶體塊一分為二(一塊的大小與使用者申請的大小一樣,另一塊就是剩下的位元組),接下來,將分配給使用者的那塊記憶體傳給使用者,並將剩下的那塊(如果有的話),返回到連結串列上,呼叫free函式時,它將使用者釋放的記憶體塊連線到空鏈上,到最後,空閒連結串列會被切成很多的小記憶體片段,如果這時使用者申請一個大的記憶體片段,那麼空閒鏈上可能沒有可能滿足使用者要求的片段了,於是malloc函式請求延時,並開始在空間中翻箱倒櫃的檢查記憶體片段,對它們進行整理,並將相鄰的小空閒塊合成較大的記憶體塊