c語(yǔ)言mlloc函數(shù) c語(yǔ)言malloc函數(shù)用法示例

c語(yǔ)言中malloc是什么?怎么用?

malloc() 函數(shù)用來(lái)動(dòng)態(tài)地分配內(nèi)存空間,其原型為:void* malloc (size_t size);

成都一家集口碑和實(shí)力的網(wǎng)站建設(shè)服務(wù)商,擁有專業(yè)的企業(yè)建站團(tuán)隊(duì)和靠譜的建站技術(shù),十多年企業(yè)及個(gè)人網(wǎng)站建設(shè)經(jīng)驗(yàn) ,為成都上千余家客戶提供網(wǎng)頁(yè)設(shè)計(jì)制作,網(wǎng)站開發(fā),企業(yè)網(wǎng)站制作建設(shè)等服務(wù),包括成都營(yíng)銷型網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),同時(shí)也為不同行業(yè)的客戶提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)的服務(wù),包括成都電商型網(wǎng)站制作建設(shè),裝修行業(yè)網(wǎng)站制作建設(shè),傳統(tǒng)機(jī)械行業(yè)網(wǎng)站建設(shè),傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設(shè)。在成都做網(wǎng)站,選網(wǎng)站制作建設(shè)服務(wù)商就選成都創(chuàng)新互聯(lián)

說(shuō)明:

【參數(shù)說(shuō)明】

size 為需要分配的內(nèi)存空間的大小,以字節(jié)(Byte)計(jì)。

【函數(shù)說(shuō)明】

malloc() 在堆區(qū)分配一塊指定大小的內(nèi)存空間,用來(lái)存放數(shù)據(jù)。這塊內(nèi)存空間在函數(shù)執(zhí)行完成后不會(huì)被初始化,它們的值是未知的。如果希望在分配內(nèi)存的同時(shí)進(jìn)行初始化,請(qǐng)使用 calloc()() 函數(shù)。

【返回值】

分配成功返回指向該內(nèi)存的地址,失敗則返回 NULL。

操作:

由于申請(qǐng)內(nèi)存空間時(shí)可能有也可能沒(méi)有,所以需要自行判斷是否申請(qǐng)成功,再進(jìn)行后續(xù)操作。

如果 size 的值為 0,那么返回值會(huì)因標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)的不同而不同,可能是 NULL,也可能不是,但返回的指針不應(yīng)該再次被引用。

注意:函數(shù)的返回值類型是 void *,void 并不是說(shuō)沒(méi)有返回值或者返回空指針,而是返回的指針類型未知。所以在使用 malloc() 時(shí)通常需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,將 void 指針轉(zhuǎn)換成我們希望的類型,例如:

#includestdlib.h

typedef int ListData;

ListData *data; ?//存儲(chǔ)空間基址

data = ( ListData * ) malloc( 100 * sizeof ( ListData ) );

擴(kuò)展資料

實(shí)現(xiàn)malloc的方法:

(1)數(shù)據(jù)結(jié)構(gòu)

首先我們要確定所采用的數(shù)據(jù)結(jié)構(gòu)。一個(gè)簡(jiǎn)單可行方案是將堆內(nèi)存空間以塊的形式組織起來(lái),每個(gè)塊由meta區(qū)和數(shù)據(jù)區(qū)組成,meta區(qū)記錄數(shù)據(jù)塊的元信息(數(shù)據(jù)區(qū)大小、空閑標(biāo)志位、指針等等)。

數(shù)據(jù)區(qū)是真實(shí)分配的內(nèi)存區(qū)域,并且數(shù)據(jù)區(qū)的第一個(gè)字節(jié)地址即為malloc返回的地址 。

(2)尋找合適的block

現(xiàn)在考慮如何在block鏈中查找合適的block。一般來(lái)說(shuō)有兩種查找算法:

First fit:從頭開始,使用第一個(gè)數(shù)據(jù)區(qū)大小大于要求size的塊所謂此次分配的塊

Best fit:從頭開始,遍歷所有塊,使用數(shù)據(jù)區(qū)大小大于size且差值最小的塊作為此次分配的塊

兩種方式各有千秋,best fit有較高的內(nèi)存使用率(payload較高),而first fit具有較高的運(yùn)行效率。這里我們采用first fit算法。

(3)開辟新的block?

如果現(xiàn)有block都不能滿足size的要求,則需要在鏈表最后開辟一個(gè)新的block。

(4)分裂block?

First fit有一個(gè)比較致命的缺點(diǎn),就是可能會(huì)讓更小的size占據(jù)很大的一塊block,此時(shí),為了提高payload,應(yīng)該在剩余數(shù)據(jù)區(qū)足夠大的情況下,將其分裂為一個(gè)新的block。

(5)malloc的實(shí)現(xiàn)

有了上面的代碼,我們就可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的malloc.注意首先我們要定義個(gè)block鏈表的頭first_block,初始化為NULL;另外,我們需要剩余空間至少有BLOCK_SIZE+8才執(zhí)行分裂操作

由于我們需要malloc分配的數(shù)據(jù)區(qū)是按8字節(jié)對(duì)齊,所以size不為8的倍數(shù)時(shí),我們需要將size調(diào)整為大于size的最小的8的倍數(shù)。

malloc函數(shù)的用法是什么?

C語(yǔ)言中malloc是動(dòng)態(tài)內(nèi)存分配函數(shù)。

函數(shù)原型:void *malloc(unsigned int num_bytes);

參數(shù):num_bytes 是無(wú)符號(hào)整型,用于表示分配的字節(jié)數(shù)。

返回值:如果分配成功則返回指向被分配內(nèi)存的指針(此存儲(chǔ)區(qū)中的初始值不確定),否則返回空指針NULL。void* 表示未確定類型的指針,void *可以指向任何類型的數(shù)據(jù),更明確的說(shuō)是指申請(qǐng)內(nèi)存空間時(shí)還不知道用戶是用這段空間來(lái)存儲(chǔ)什么類型的數(shù)據(jù)(比如是char還是int或者...)

功能:分配長(zhǎng)度為num_bytes字節(jié)的內(nèi)存塊

注意:當(dāng)內(nèi)存不再使用時(shí),應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。函數(shù)返回的指針一定要適當(dāng)對(duì)齊,使其可以用于任何數(shù)據(jù)對(duì)象。關(guān)于該函數(shù)的原型,在以前malloc返回的是char型指針,新的ANSIC標(biāo)準(zhǔn)規(guī)定,該函數(shù)返回為void型指針,因此必要時(shí)要進(jìn)行類型轉(zhuǎn)換。

擴(kuò)展資料:

實(shí)現(xiàn)malloc的方法:

(1)數(shù)據(jù)結(jié)構(gòu)

首先我們要確定所采用的數(shù)據(jù)結(jié)構(gòu)。一個(gè)簡(jiǎn)單可行方案是將堆內(nèi)存空間以塊的形式組織起來(lái),每個(gè)塊由meta區(qū)和數(shù)據(jù)區(qū)組成,meta區(qū)記錄數(shù)據(jù)塊的元信息(數(shù)據(jù)區(qū)大小、空閑標(biāo)志位、指針等等)。

數(shù)據(jù)區(qū)是真實(shí)分配的內(nèi)存區(qū)域,并且數(shù)據(jù)區(qū)的第一個(gè)字節(jié)地址即為malloc返回的地址 。

(2)尋找合適的block

現(xiàn)在考慮如何在block鏈中查找合適的block。一般來(lái)說(shuō)有兩種查找算法:

First fit:從頭開始,使用第一個(gè)數(shù)據(jù)區(qū)大小大于要求size的塊所謂此次分配的塊

Best fit:從頭開始,遍歷所有塊,使用數(shù)據(jù)區(qū)大小大于size且差值最小的塊作為此次分配的塊

兩種方式各有千秋,best fit有較高的內(nèi)存使用率(payload較高),而first fit具有較高的運(yùn)行效率。這里我們采用first fit算法。

?'>C語(yǔ)言中的malloc函數(shù)用法>?

C語(yǔ)言中malloc是動(dòng)態(tài)內(nèi)存分配函數(shù)。

函數(shù)原型:void *malloc(unsigned int num_bytes)。

參數(shù):num_bytes 是無(wú)符號(hào)整型,用于表示分配的字節(jié)數(shù)。

注意:當(dāng)內(nèi)存不再使用時(shí),應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。函數(shù)返回的指針一定要適當(dāng)對(duì)齊,使其可以用于任何數(shù)據(jù)對(duì)象。關(guān)于該函數(shù)的原型,在以前malloc返回的是char型指針,新的ANSIC標(biāo)準(zhǔn)規(guī)定,該函數(shù)返回為void型指針,因此必要時(shí)要進(jìn)行類型轉(zhuǎn)換。

實(shí)現(xiàn)malloc的方法:

首先我們要確定所采用的數(shù)據(jù)結(jié)構(gòu)。一個(gè)簡(jiǎn)單可行方案是將堆內(nèi)存空間以塊的形式組織起來(lái),每個(gè)塊由meta區(qū)和數(shù)據(jù)區(qū)組成,meta區(qū)記錄數(shù)據(jù)塊的元信息(數(shù)據(jù)區(qū)大小、空閑標(biāo)志位、指針等等)。

數(shù)據(jù)區(qū)是真實(shí)分配的內(nèi)存區(qū)域,并且數(shù)據(jù)區(qū)的第一個(gè)字節(jié)地址即為malloc返回的地址 。

當(dāng)前名稱:c語(yǔ)言mlloc函數(shù) c語(yǔ)言malloc函數(shù)用法示例
文章路徑:http://muchs.cn/article10/dohoego.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、面包屑導(dǎo)航外貿(mào)建站、網(wǎng)站排名、網(wǎng)站設(shè)計(jì)建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)