free只能釋放由堆動(dòng)態(tài)申請(qǐng)的空間,但是第一個(gè)中p,q兩個(gè)不同的指針變量指向同一片地址,
10多年的班瑪網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整班瑪建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“班瑪網(wǎng)站設(shè)計(jì)”,“班瑪網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
free(q);
q = NULL;
后,q和p指向的空間被釋放,且q被賦值為NULL,但是此時(shí)p變量的值并沒有改變,即其值還是原來申請(qǐng)的空間的首地址。這里注意原來申請(qǐng)的空間已被釋放,只是p還保留那篇空間的首地址值,所以一般開發(fā)中釋放空間后,要把相關(guān)變量賦值為NULL,以防后面會(huì)非法訪問一個(gè)已經(jīng)釋放的空間。
第二個(gè),釋放了。
free 只是用來釋放 malloc 函數(shù)在堆上申請(qǐng)的空間 別的什么也干不了!
用法:
如 int *p = malloc (sizeof(int) * 4)
free(p);
malloc,calloc,new都是申請(qǐng)分配內(nèi)存空間,然而各有不同,其中new申請(qǐng)的時(shí)侯是不管申請(qǐng)是否成功;malloc和calloc申請(qǐng)內(nèi)存,同時(shí)判定是否申請(qǐng)成功,進(jìn)而malloc還可以初始化申請(qǐng)到得內(nèi)存的每一字節(jié)為0。Free是釋放占用的內(nèi)存空間。
free()為C語言函數(shù)。
頭文件:malloc.h或stdlib.h
作用:釋放malloc(或calloc、realloc)函數(shù)給指針變量分配的內(nèi)存空間的函數(shù)。
使用后該指針變量一定要重新指向NULL,防止野指針出現(xiàn),有效 規(guī)避誤操作。
用 法: void free(void *ptr);
程序例:
#include string.h
#include stdio.h
#include alloc.h //or #include malloc.h
int main(void)
{
char *str;
/* allocate memory for string */
str = (char *)malloc(10);
/* copy "Hello" to string */
strcpy(str, "Hello");
/* display string */
printf("String is %s\n", str);
/* free memory */
free(str);
return 0;
}
因?yàn)閒ree函數(shù)僅僅是告訴操作系統(tǒng),這一塊內(nèi)存被釋放了,可以用來作其它用途。但是,由于你沒有重新對(duì)這塊內(nèi)存進(jìn)行寫操作,所以內(nèi)存中的變量數(shù)值并沒有發(fā)生變化。所以輸出值不變。
通常建議,將這個(gè)p用完了也置NULL
比如
int *a = (int*)malloc (100*sizeof(int));
int *b = a, *c = a + 10;
那么free(b) 和 free(a)是合法,他們的工作都是釋放申請(qǐng)的a的內(nèi)存100個(gè)int
再如用遞歸創(chuàng)建鏈表,
node* a = (node*)malloc(sizeof(node));
a-next = (node*)malloc(sizeof(node));
... ...
free(a)只釋放node的申請(qǐng)內(nèi)存,a-next不會(huì)釋放,這樣做會(huì)造成內(nèi)存泄漏!
free的使用參考