1. 分配內(nèi)存空間函數(shù)malloc
創(chuàng)新互聯(lián)成都企業(yè)網(wǎng)站建設(shè)服務(wù),提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作網(wǎng)站開發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設(shè)計,成都響應(yīng)式網(wǎng)站建設(shè)公司,網(wǎng)頁設(shè)計師打造企業(yè)風(fēng)格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務(wù)。歡迎咨詢做網(wǎng)站需要多少錢:18980820575
調(diào)用形式:
(類型說明符*)malloc(size)
功能:在內(nèi)存的動態(tài)存儲區(qū)中分配一塊長度為"size"字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。
“類型說明符”表示把該區(qū)域用于何種數(shù)據(jù)類型。
(類型說明符*)表示把返回值強(qiáng)制轉(zhuǎn)換為該類型指針。
“size”是一個無符號數(shù)。
例如:
pc=(char *)malloc(100);
表示分配100個字節(jié)的內(nèi)存空間,并強(qiáng)制轉(zhuǎn)換為字符數(shù)組類型,函數(shù)的返回值為指向該字符數(shù)組的指針,把該指針賦予指針變量pc。
2. 分配內(nèi)存空間函數(shù) calloc
calloc 也用于分配內(nèi)存空間。
調(diào)用形式:
(類型說明符*)calloc(n,size)
功能:在內(nèi)存動態(tài)存儲區(qū)中分配n塊長度為“size”字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。
(類型說明符*)用于強(qiáng)制類型轉(zhuǎn)換。
calloc函數(shù)與malloc 函數(shù)的區(qū)別僅在于一次可以分配n塊區(qū)域。
例如:
ps=(struet stu*)calloc(2,sizeof(struct stu));
其中的sizeof(struct stu)是求stu的結(jié)構(gòu)長度。因此該語句的意思是:按stu的長度分配2塊連續(xù)區(qū)域,強(qiáng)制轉(zhuǎn)換為stu類型,并把其首地址賦予指針變量ps。
2. 釋放內(nèi)存空間函數(shù)free
調(diào)用形式:
free(void*ptr);
功能:釋放ptr所指向的一塊內(nèi)存空間,ptr是一個任意類型的指針變量,它指向被釋放區(qū)域的首地址。被釋放區(qū)應(yīng)是由malloc或calloc函數(shù)所分配的區(qū)域。
【例】分配一塊區(qū)域,輸入一個學(xué)生數(shù)據(jù)。
main()
{
struct stu
{
int num;
char *name;
char sex;
float score;
} *ps;
ps=(struct stu*)malloc(sizeof(struct stu));
ps-num=102;
ps-name="Zhang ping";
ps-sex='M';
ps-score=62.5;
printf("Number=%d\nName=%s\n",ps-num,ps-name);
printf("Sex=%c\nScore=%f\n",ps-sex,ps-score);
free(ps);
}
本例中,定義了結(jié)構(gòu)stu,定義了stu類型指針變量ps。然后分配一塊stu大內(nèi)存區(qū),并把首地址賦予ps,使ps指向該區(qū)域。再以ps為指向結(jié)構(gòu)的指針變量對各成員賦值,并用printf輸出各成員值。最后用free函數(shù)釋放ps指向的內(nèi)存空間。整個程序包含了申請內(nèi)存空間、使用內(nèi)存空間、釋放內(nèi)存空間三個步驟,實現(xiàn)存儲空間的動態(tài)分配。
free只能釋放由堆動態(tài)申請的空間,但是第一個中p,q兩個不同的指針變量指向同一片地址,
free(q);
q = NULL;
后,q和p指向的空間被釋放,且q被賦值為NULL,但是此時p變量的值并沒有改變,即其值還是原來申請的空間的首地址。這里注意原來申請的空間已被釋放,只是p還保留那篇空間的首地址值,所以一般開發(fā)中釋放空間后,要把相關(guān)變量賦值為NULL,以防后面會非法訪問一個已經(jīng)釋放的空間。
第二個,釋放了。
void free(void *ptr)
{
struct mem_control_block *free;
free = ptr - sizeof(struct mem_control_block);
free-is_available = 1;
return;
}
其實很簡單,就是把內(nèi)存的標(biāo)記設(shè)置為可用(并包括用于管理的內(nèi)存).
至于系統(tǒng)如何根據(jù)這些標(biāo)記去分配內(nèi)存我不清楚,那是各個系統(tǒng)的事情了.
首先肯定你的主動思考,學(xué)習(xí)的主動性
然后明確說,malloc/free有多種不同的實現(xiàn),可以認(rèn)為都是采用第二種辦法,或者變相采用第二種辦法。
首先說靜態(tài)變量行不通,不太可能只調(diào)用一次malloc,調(diào)第二次就覆蓋掉了,行不通。
一般的實現(xiàn),是把分配內(nèi)存的長度等信息放在malloc來的指針的前面,用一個小結(jié)構(gòu)來記錄分配的大小以及狀態(tài)信息,想要查證也不難,去下載一些源代碼閱讀一下就行。
至于你說的釋放最近一次分配的內(nèi)存,是另一個話題,涉及到內(nèi)存泄漏。
舉個小片段:
char *a = (char *)malloc(100);
a = (char *)malloc(100);
free(a);
分配了兩次,只能free最后一次分配的,前一次分配的,丟掉了,找不回來。
這個最后一次,指的是這個意思
不可以的。
malloc, alloc, free是c定義的一組內(nèi)存管理的API函數(shù),當(dāng)你調(diào)用malloc、alloc分配內(nèi)存時,不僅僅是從堆里面分配得到了可用內(nèi)存,實際上內(nèi)存管理子系統(tǒng)還會維護(hù)了內(nèi)存列表。你自己定義的指針不會在這個列表中的,所以free會出問題的。
那么,使用new, GlobalAlloc之類的方式分配的內(nèi)存可不可以使用free呢。我的回答是,盡量不要,大部分情況都會帶來風(fēng)險。這里面涉及new, malloc, GlobalAlloc, HeapAlloc, LocalAlloc,VirtualAlloc等函數(shù)的區(qū)別。
因為free函數(shù)僅僅是告訴操作系統(tǒng),這一塊內(nèi)存被釋放了,可以用來作其它用途。但是,由于你沒有重新對這塊內(nèi)存進(jìn)行寫操作,所以內(nèi)存中的變量數(shù)值并沒有發(fā)生變化。所以輸出值不變。
通常建議,將這個p用完了也置NULL