malloc() 函數(shù)用來(lái)動(dòng)態(tài)地分配內(nèi)存空間,其原型為:void* malloc (size_t size);
彰武網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,彰武網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為彰武成百上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的彰武做網(wǎng)站的公司定做!
說(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ù)的返回值類(lèi)型是 void *,void 并不是說(shuō)沒(méi)有返回值或者返回空指針,而是返回的指針類(lèi)型未知。所以在使用 malloc() 時(shí)通常需要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換,將 void 指針轉(zhuǎn)換成我們希望的類(lèi)型,例如:
#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:從頭開(kāi)始,使用第一個(gè)數(shù)據(jù)區(qū)大小大于要求size的塊所謂此次分配的塊
Best fit:從頭開(kāi)始,遍歷所有塊,使用數(shù)據(jù)區(qū)大小大于size且差值最小的塊作為此次分配的塊
兩種方式各有千秋,best fit有較高的內(nèi)存使用率(payload較高),而first fit具有較高的運(yùn)行效率。這里我們采用first fit算法。
(3)開(kāi)辟新的block?
如果現(xiàn)有block都不能滿(mǎn)足size的要求,則需要在鏈表最后開(kāi)辟一個(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ù)。
打開(kāi)文件、判斷大小、申請(qǐng)內(nèi)存空間、初始化內(nèi)存空間,復(fù)制讀文件內(nèi)容到內(nèi)存空間帶詳細(xì)注解源代碼。
1、定義數(shù)組的時(shí)候數(shù)組的長(zhǎng)度是預(yù)先定義好的,在整個(gè)程序中固定不變。
2、但是在實(shí)際的編程中,往往會(huì)發(fā)生這種情況,即所需的內(nèi)存空間取決于實(shí)際輸入的數(shù)據(jù),而無(wú)法預(yù)先確定。
3、為了解決上述問(wèn)題,C語(yǔ)言提供了一些內(nèi)存管理函數(shù),這些內(nèi)存管理函數(shù)可以按需要?jiǎng)討B(tài)的分配內(nèi)存空間,也可把不再使用的空間回收再次利用。
上面那個(gè),你貌似不懂耶
看好了
malloc
原型:extern void *malloc(unsigned int num_bytes);
用法:#include alloc.h
功能:分配長(zhǎng)度為num_bytes字節(jié)的內(nèi)存塊
說(shuō)明:如果分配成功則返回指向被分配內(nèi)存的指針,否則返回空指針NULL。
當(dāng)內(nèi)存不再使用時(shí),應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。
舉例:
// malloc.c
#include syslib.h
#include alloc.h
main()
{
char *p;
clrscr(); // clear screen
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");
free(p);
getchar();
return 0;
}
free
原型:extern void free(void *p);
用法:#include alloc.h
功能:釋放指針p所指向的的內(nèi)存空間。
說(shuō)明:p所指向的內(nèi)存空間必須是用calloc,malloc,realloc所分配的內(nèi)存。
如果p為NULL或指向不存在的內(nèi)存塊則不做任何操作。
舉例:
// free.c
#include syslib.h
#include alloc.h
main()
{
char *p;
clrscr(); // clear screen
textmode(0x00);
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");
getchar();
free(p); // release memory to reuse it
p=(char *)calloc(100,1);
if(p)
printf("Memory Reallocated at: %x",p);
else
printf("Not Enough Memory!\n");
free(p); // release memory at program end
getchar();
return 0;
}
為什么很多人不喜歡c,c++,因?yàn)楣芾韮?nèi)存的一部分任何必須由程序員自己管理,不然很容易內(nèi)存泄露,現(xiàn)在有很多檢查內(nèi)存泄露的軟件比較常用的有(boundchecker)有興趣的可以下個(gè)試一下自己的程序,你會(huì)發(fā)現(xiàn)自己好可怕。malloc free使用一般有幾個(gè)原則(自己總結(jié)的,不一定正確,但很實(shí)用)
1 ,malloc free必須配套使用,并且盡可能逆序。
2 ,誰(shuí)malloc的誰(shuí)free
3,能夠不動(dòng)態(tài)分配的盡量不動(dòng)態(tài)分配,動(dòng)態(tài)分配是很費(fèi)時(shí)間的,而且存在一定的風(fēng)險(xiǎn)。
很多人喜歡這樣寫(xiě)程序:
type * f()
{
type *t = (type*)malloc ( sizeof(type));
.
.
return t ;
}
這個(gè)肯定會(huì)出問(wèn)題,一般象這種情況,一般聲明f(type* t),誰(shuí)調(diào)用它誰(shuí)為t分配空間,誰(shuí)來(lái)釋放它的空間。不過(guò)很有意思的是,在有寫(xiě)系統(tǒng)函數(shù)的會(huì)這樣.如(char* asctime() ,它返回一個(gè)表示時(shí)間的字符指針,但是并不要求你釋放,你也沒(méi)有辦法釋放,但是我可以肯定它這個(gè)串肯定不是在堆區(qū)分配的)
free的順序也很重要,很多時(shí)候free的時(shí)候會(huì)出現(xiàn)空指針的引用,不足為齊。有人提議free(t);t = NULL ;這種用法,有一定的道理,當(dāng)你free一塊空間后,操作系統(tǒng)不會(huì)立即回收,所以在你再次用t的時(shí)候可能還是可以用的,t就成了個(gè)野指針,而將其t = NULL后,對(duì)t的引用會(huì)出問(wèn)題。
在內(nèi)存上有三個(gè)區(qū)域可以用來(lái)保存數(shù)據(jù),一個(gè)是棧區(qū)、一個(gè)是堆區(qū)、一個(gè)是靜態(tài)區(qū),一般常用的定義變量是在棧區(qū)開(kāi)辟,特點(diǎn)是系統(tǒng)開(kāi)辟和釋放;堆區(qū)的空間是由使用者來(lái)開(kāi)辟空間,所以需要借助malloc開(kāi)辟空間,free釋放空間。p=(char *)malloc(sizeof(char)*20);malloc函數(shù)申請(qǐng)空間,sizeof(char) * 20表示malloc開(kāi)辟空間字節(jié)數(shù)為20字節(jié),malloc前的char * 表示開(kāi)辟空間進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換為需要開(kāi)辟的空間的數(shù)據(jù)類(lèi)型。free(p)函數(shù)表示釋放由使用者開(kāi)辟的空間,因?yàn)榭臻g開(kāi)辟是手動(dòng)調(diào)用函數(shù)開(kāi)辟的空間,所以釋放空間也需要調(diào)用函數(shù)開(kāi)辟。
malloc和free是C語(yǔ)言中申請(qǐng)內(nèi)存空間與釋放內(nèi)存空間的函數(shù)。
函數(shù)原型:void
*malloc(unsigned
int
size);
功
能:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長(zhǎng)度為size的連續(xù)空間。
返
回
值:指向所分配的連續(xù)存儲(chǔ)域的起始地址的指針,若失敗,返回NULL
函數(shù)原型:void
free(void
*p);
功
能:釋放指針p所指向的內(nèi)存區(qū)
返
回
值:無(wú)
舉例如下:
int *p; // 定義一個(gè)int類(lèi)型的指針
p = (int *)malloc(4); // 分配4個(gè)連續(xù)的內(nèi)存單元給指針p
free(p); // 釋放指針p所指向的內(nèi)存單元