日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

malloc,realloc,calloc的使用场合及特点,以及malloc的实现原理

發(fā)布時間:2025/1/21 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 malloc,realloc,calloc的使用场合及特点,以及malloc的实现原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

malloc:


原型 : ?extern void *malloc(unsigned int num_bytes);


何時使用:當需要在內存的動態(tài)存儲區(qū)中分配一塊長度為num_bytes字節(jié)的連續(xù)區(qū)域時。參數(shù)num_bytes為需要的內存空間的長度,返回該區(qū)域的地址。

特點:

malloc在動態(tài)分配完內存后不對分配的內存空間初始化,里邊數(shù)據(jù)是隨機的垃圾數(shù)據(jù)。


實現(xiàn)原理:

它有一個將可用的內存塊連接為一個長長的列表的所謂空閑鏈表。調用malloc函數(shù)時,它沿鏈表尋找一個大到足以滿足用戶請求所需要的內存 塊。然后,將該內存塊一分為二(一塊的大小與用戶請求的大小相等,另一塊的大小就是剩下的字節(jié))。接下來,將分配給用戶的那塊內存?zhèn)鹘o用戶,并將剩下的那塊(如果有的話)返回到連接表上。調用free函數(shù)時,它將用戶釋放的內存塊連接到空閑鏈上。到最后,空閑鏈會被切成很多的小內存片段,如果這時用戶申請一個大的內存片段,那么空閑鏈上可能沒有可以滿足用戶要求的片段了。于是,malloc函數(shù)請求延時,并開始在空閑鏈上翻箱倒柜地檢查各內存片段,對它們進行整理,將相鄰的小空閑塊合并成較大的內存塊。如果無法獲得符合要求的內存塊,malloc函數(shù)會返回NULL指針,因此在調用malloc動態(tài)申請內存塊時,一定要進行返回值的判斷。



calloc


原型:void *calloc(size_t n, size_t size);


何時使用:當需要在內存的動態(tài)存儲區(qū)中分配n個長度為size_t size字節(jié)的連續(xù)空間時。如果分配成功,函數(shù)返回一個指向分配起始地址的指針;如果分配不成功,返回NULL。

特點:

calloc在動態(tài)分配完內存后,自動初始化該內存空間為零。



realloc

原型:extern void *realloc(void *mem_address, unsigned int newsize);

何時使用:當需要在已經被(malloc(), calloc(), 或realloc())分配的空間的基礎上重新分配空間時。參數(shù)mem_address為原有的空間地址,newsize是重新申請的地址空間。

特點:

①傳遞給realloc的指針必須是先前通過malloc(), calloc(), 或realloc()分配的


②如果realloc需要的內存小于原來的內存大小,會導致數(shù)據(jù)丟失;如果原來的內存后面還有足夠多剩余內存的話,realloc的內存=原來的內存+剩余內存,realloc還是返回原來內存的地址; 如果原來的內存后面沒有足夠多剩余內存的話,realloc將申請新的內存,然后把原來的內存數(shù)據(jù)拷貝到新內存里,原來的內存將被free掉,realloc返回新內存的地址


如果沒有足夠可用的內存用來完成重新分配(擴大原來的內存塊或者分配新的內存塊),則返回NULL。而原來的內存塊保持不變。


④如果newsize大小為0,那么釋放mem_address指向的內存,并返回NULL。


⑤如果mem_address為NULL,則realloc()和malloc()類似。分配一個newsize的內存塊,返回一個指向該內存塊的指針。



總結

以上是生活随笔為你收集整理的malloc,realloc,calloc的使用场合及特点,以及malloc的实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。