① malloc函數(shù)返回的是void*類型,因此別忘了強制轉(zhuǎn)換品姓。
② malloc的實質(zhì):
? ? ? ? 它有一個將可用的內(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)存片段督笆,對它們進(jìn)行整理,將相鄰的小空閑塊合并成較大的內(nèi)存塊截歉。如果無法獲得符合要求的內(nèi)存塊胖腾,malloc函數(shù)會返回NULL指針,因此在調(diào)用malloc動態(tài)申請內(nèi)存塊時瘪松,一定要進(jìn)行返回值判斷!
③ free()
? ? ? ? free釋放的是指針指向的【內(nèi)存】锨阿,指針只是一個變量宵睦。指針在其指向的內(nèi)存釋放后,指向的內(nèi)容的垃圾是未定義的墅诡。因此壳嚎,釋放內(nèi)存后把指針指向NULL,防止指針在后面不小心又被解引用了末早。