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