malloc,realloc,calloc的使用场合及特点,以及malloc的实现原理
malloc:
原型 : ?extern void *malloc(unsigned int num_bytes);
何時使用:當需要在內存的動態存儲區中分配一塊長度為num_bytes字節的連續區域時。參數num_bytes為需要的內存空間的長度,返回該區域的地址。
特點:
malloc在動態分配完內存后不對分配的內存空間初始化,里邊數據是隨機的垃圾數據。
實現原理:
它有一個將可用的內存塊連接為一個長長的列表的所謂空閑鏈表。調用malloc函數時,它沿鏈表尋找一個大到足以滿足用戶請求所需要的內存 塊。然后,將該內存塊一分為二(一塊的大小與用戶請求的大小相等,另一塊的大小就是剩下的字節)。接下來,將分配給用戶的那塊內存傳給用戶,并將剩下的那塊(如果有的話)返回到連接表上。調用free函數時,它將用戶釋放的內存塊連接到空閑鏈上。到最后,空閑鏈會被切成很多的小內存片段,如果這時用戶申請一個大的內存片段,那么空閑鏈上可能沒有可以滿足用戶要求的片段了。于是,malloc函數請求延時,并開始在空閑鏈上翻箱倒柜地檢查各內存片段,對它們進行整理,將相鄰的小空閑塊合并成較大的內存塊。如果無法獲得符合要求的內存塊,malloc函數會返回NULL指針,因此在調用malloc動態申請內存塊時,一定要進行返回值的判斷。
calloc
原型:void *calloc(size_t n, size_t size);
何時使用:當需要在內存的動態存儲區中分配n個長度為size_t size字節的連續空間時。如果分配成功,函數返回一個指向分配起始地址的指針;如果分配不成功,返回NULL。
特點:
calloc在動態分配完內存后,自動初始化該內存空間為零。
realloc
原型:extern void *realloc(void *mem_address, unsigned int newsize);
何時使用:當需要在已經被(malloc(), calloc(), 或realloc())分配的空間的基礎上重新分配空間時。參數mem_address為原有的空間地址,newsize是重新申請的地址空間。
特點:
①傳遞給realloc的指針必須是先前通過malloc(), calloc(), 或realloc()分配的
②如果realloc需要的內存小于原來的內存大小,會導致數據丟失;如果原來的內存后面還有足夠多剩余內存的話,realloc的內存=原來的內存+剩余內存,realloc還是返回原來內存的地址; 如果原來的內存后面沒有足夠多剩余內存的話,realloc將申請新的內存,然后把原來的內存數據拷貝到新內存里,原來的內存將被free掉,realloc返回新內存的地址
③如果沒有足夠可用的內存用來完成重新分配(擴大原來的內存塊或者分配新的內存塊),則返回NULL。而原來的內存塊保持不變。
④如果newsize大小為0,那么釋放mem_address指向的內存,并返回NULL。
⑤如果mem_address為NULL,則realloc()和malloc()類似。分配一個newsize的內存塊,返回一個指向該內存塊的指針。
總結
以上是生活随笔為你收集整理的malloc,realloc,calloc的使用场合及特点,以及malloc的实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: memcpy和strcpy的区别及mem
- 下一篇: C语言如何实现面向对象?