1. malloc和free
malloc和free,分別用于執(zhí)行動(dòng)態(tài)內(nèi)存分配和釋放。
這些函數(shù)維護(hù)一個(gè)可用內(nèi)存池,當(dāng)一個(gè)程序另外需要一些內(nèi)存時(shí),他就調(diào)用malloc函數(shù),malloc從內(nèi)存池中提取一塊合適的內(nèi)存,并向該程序返回一個(gè)指向這塊內(nèi)存的指針。這塊內(nèi)存并沒(méi)有以任何方式進(jìn)行初始化。如果對(duì)這塊內(nèi)存進(jìn)行初始化非常重要,你要么自己動(dòng)手進(jìn)行初始化,要么使用calloc函數(shù)。
函數(shù)原型:
#include <stdlib.h>
void *malloc(size_t size);
void free(void *ptr);
malloc的參數(shù)就是需要分配的字節(jié)數(shù),如果內(nèi)存池中的可用內(nèi)存可以滿足這個(gè)需求,malloc就返回一個(gè)指向被分配的內(nèi)存塊起始位置的指針。
malloc分配的一塊連續(xù)的內(nèi)存。如果分配失敗則函數(shù)返回NULL。
2.calloc和realloc
函數(shù)原型:
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
calloc也用于內(nèi)存分配。
malloc和calloc之間主要區(qū)別是后者返回指向內(nèi)存指針之前把它初始化為0。
calloc和malloc之間另一個(gè)較小的區(qū)別是他們請(qǐng)求內(nèi)存數(shù)量的方式不同。calloc的參數(shù)包括所需元素 的數(shù)量和每個(gè)元素的字節(jié)數(shù)。根據(jù)這些值,它能夠計(jì)算出總共需要分配的內(nèi)存數(shù)
realloc函數(shù)用于修改一個(gè)原先已經(jīng)分配的內(nèi)存塊大小。使用這個(gè)函數(shù),你可以使一塊內(nèi)存擴(kuò)大或縮小。如果它用于擴(kuò)大一個(gè)內(nèi)存塊,那么這塊內(nèi)存原先的內(nèi)容依然保留,新增加的內(nèi)存添加到原先內(nèi)存塊的后面,新內(nèi)存并未以任何方式進(jìn)行初始化。如果它用于縮小一個(gè)內(nèi)存塊,該內(nèi)存塊尾部的部分便被拿掉,剩余部分內(nèi)存的原先內(nèi)存依然保留。如果原先的內(nèi)存塊無(wú)法改變大小,realloc將分配一塊正確大小的內(nèi)存,并把原先內(nèi)存的內(nèi)存復(fù)制到新塊上,因此,在使用realloc之后,你就不能再使用指向舊內(nèi)存的指針,而是應(yīng)該改用realloc所返回的新指針。如果realloc函數(shù)的第一個(gè)參數(shù)是NULL,那么它等同于malloc