許多的程序需要為動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)分配內(nèi)存逗抑,此類數(shù)據(jù)結(jié)構(gòu)的大小由運(yùn)行時(shí)所獲得信息決定。在堆或者堆棧中分配內(nèi)存。
1邮府、malloc()和free()
void * malloc(size_t size);
malloc()函數(shù)在堆上分配參數(shù)size大小的內(nèi)存荧关,并且返回指向新分配內(nèi)存的起始位置處的指針。注意:分配的內(nèi)存沒有初始化褂傀。返回的是類型是通用指針void*忍啤,因此它可以賦值給任意類型的指針。
malloc()返回內(nèi)存塊所采用的是字節(jié)對(duì)齊方式
malloc()函數(shù)和free()函數(shù)一起使用紊服。
2檀轨、calloc()
除了malloc()函數(shù)胸竞,還有calloc()函數(shù)用于分配內(nèi)存欺嗤。
void * calloc(size_t numitems,size_t size);
第一個(gè)參數(shù)指定分配對(duì)象的個(gè)數(shù),第二個(gè)參數(shù)指定每一個(gè)對(duì)象的大小卫枝。再分配內(nèi)存以后煎饼,函數(shù)返回指向這一塊內(nèi)存起始處的指針。與malloc()不同的是校赤,calloc()函數(shù)會(huì)將已經(jīng)分配的內(nèi)存初始化為0吆玖;
使用calloc()函數(shù)分配的內(nèi)存使用free()來釋放。
也就是說马篮,如果由malloc()函數(shù)分配的內(nèi)存空間原來沒有被使用過沾乘,則其中的每一位可能都是0;反之,如果這部分內(nèi)存曾經(jīng)被分配過,則其中可能遺留有各種各樣的數(shù)據(jù)。也就是說浑测,使用malloc()函數(shù)的程序開始時(shí)(內(nèi)存空間還沒有被重新分配)能正常進(jìn)行,但經(jīng)過一段時(shí)間(內(nèi)存空間還已經(jīng)被重新分配)可能會(huì)出現(xiàn)問題翅阵。
函數(shù)calloc()會(huì)將所分配的內(nèi)存空間中的每一位都初始化為零,也就是說,如果你是為字符類型或整數(shù)類型的元素分配內(nèi)存,那麼這些元素將保證會(huì)被初始化為0;如果你是為指針類型的元素分配內(nèi)存,那麼這些元素通常會(huì)被初始化為空指針;如果你為實(shí)型數(shù)據(jù)分配內(nèi)存,則這些元素會(huì)被初始化為浮點(diǎn)型的零。
3迁央、new()
從函數(shù)聲明上可以看出掷匠。malloc 和 new 至少有兩個(gè)不同: new 返回指定類型的指針,并且可以自動(dòng)計(jì)算所需要大小:
int *p;
p=new int;//返回的類型是int*類型
而malloc()必須我們自己計(jì)算字節(jié)數(shù)岖圈,并且在返回后強(qiáng)制轉(zhuǎn)化為實(shí)際類型的指針讹语。
int *p;
p=(int *)malloc(sizeof(int));
第一:malloc 函數(shù)返回的是 void * 類型,如果你寫成:p = malloc (sizeof(int)); 則程序無法通過編譯蜂科,報(bào)錯(cuò):“不能將 void* 賦值給 int * 類型變量”顽决。所以必須通過 (int *) 來將強(qiáng)制轉(zhuǎn)換。
第二:函數(shù)的實(shí)參為 sizeof(int) 导匣,用于指明一個(gè)整型數(shù)據(jù)需要的大小擎值。如果你寫成:
int* p = (int *) malloc (1);
代碼也能通過編譯,但事實(shí)上只分配了1個(gè)字節(jié)大小的內(nèi)存空間逐抑,當(dāng)你往里頭存入一個(gè)整數(shù)鸠儿,就會(huì)有3個(gè)字節(jié)無家可歸,而直接“住進(jìn)鄰居家”!造成的結(jié)果是后面的內(nèi)存中原有數(shù)據(jù)內(nèi)容全部被清空进每。
new和delete配合使用汹粤。