摘要:一動(dòng)態(tài)內(nèi)存的函數(shù)和頭文件功能向堆區(qū)申請(qǐng)一塊大小為的連續(xù)的空間,并返回該空間的起始地址。若指向的不是動(dòng)態(tài)分配的內(nèi)存,函數(shù)的行為標(biāo)準(zhǔn)未定義,取決于編譯器。
??? 常規(guī)開(kāi)辟空間的方式,開(kāi)辟出空間的大小是固定的(尤其是數(shù)組的開(kāi)辟需要預(yù)先給定空間),而動(dòng)態(tài)內(nèi)存分配可以解決這個(gè)問(wèn)題。
1?? malloc:
void* malloc (size_t size);
??? 頭文件: stdlib.h
??? 功能:向堆區(qū)申請(qǐng)一塊大小為size
的連續(xù)的空間,并返回該空間的起始地址。
NULL
。?注意:
??? ① 返回值的類型是 void*
,所以malloc
函數(shù)并不知道開(kāi)辟空間的類型,具體在使用的時(shí)候使用者自己來(lái)決定。
//eg.int* p = (int*)malloc(40);//強(qiáng)制類型轉(zhuǎn)換為int*
??? ② 如果參數(shù) size
為0
,malloc
的行為是標(biāo)準(zhǔn)是未定義的,取決于編譯器。
2?? free:
void free (void* ptr);
??? 功能:釋放動(dòng)態(tài)開(kāi)辟的內(nèi)存。
?注意:
??? ① 若ptr
指向的是NULL
,函數(shù)啥也不做。
??? ② 若ptr
指向的不是動(dòng)態(tài)分配的內(nèi)存,free
函數(shù)的行為標(biāo)準(zhǔn)未定義,取決于編譯器。
//egint main(){ int num = 0; scanf("%d", &num); int* ptr = NULL; ptr = (int*)malloc(num * sizeof(int));//動(dòng)態(tài)開(kāi)辟空間 if (NULL != ptr)//是否開(kāi)辟成功 { int i = 0; for (i = 0; i < num; i++) { *(ptr + i) = 0; } } free(ptr);//釋放ptr所指向的動(dòng)態(tài)內(nèi)存 //雖然free將空間釋放但是ptr還可以找到那塊空間,所以需要將ptr置NULL ptr = NULL; return 0;}
Summary:
malloc
與free
是一對(duì),malloc
開(kāi)辟后需要檢測(cè)是否成功,free
釋放后需要置NULL
。
void* calloc (size_t num, size_t size);
??? 功能:向堆區(qū)申請(qǐng)num
個(gè)大小為size
的空間,并將空間的每一個(gè)字節(jié)初始化為0
,返回該空間的起始地址。
//eg.int main(){ int* p = (int*)calloc(10, sizeof(int)); if (NULL != p) { //使用空間 } free(p); p = NULL; return 0;}
void* realloc (void* ptr, size_t size);
??? 功能:將ptr
指向的空間調(diào)整為size
大小,返回調(diào)整之后的內(nèi)存起始位置。
?注意:有兩種調(diào)整內(nèi)存空間的情況:
??? ① 原有空間之后有足夠大的空間:在原有空間的基礎(chǔ)上向后延伸,不改變?cè)袛?shù)據(jù)。
??? ② 原有空間之后沒(méi)有足夠大的空間:在堆區(qū)上找一個(gè)連續(xù)的合適空間,返回新空間的起始地址。并將數(shù)據(jù)轉(zhuǎn)移到新地址中,舊地址釋放。
//eg.int main(){ int* ptr = (int*)malloc(100); if (ptr != NULL) { //業(yè)務(wù)處理 } else { exit(EXIT_FAILURE); //EXIT_FAILURE 可以作為exit ()的參數(shù)來(lái)使用,表示沒(méi)有成功地執(zhí)行一個(gè)程序 //EXIT_SUCCESS 作為exit ()的參數(shù)來(lái)使用,表示成功地執(zhí)行一個(gè)程序 } //擴(kuò)容 int* p = NULL; p = realloc(ptr, 1000);//要注意需要新建一個(gè)變量以免開(kāi)辟失敗而造成原地址丟失 if (p != NULL) { ptr = p; } free(ptr); ptr = NULL; return 0;}
Summary:
所有動(dòng)態(tài)內(nèi)存開(kāi)辟后,最好都檢測(cè)一遍是否成功,釋放后都置NULL
。
在堆區(qū)申請(qǐng)的空間,有兩種回收方式
- free
- 程序退出時(shí),申請(qǐng)的空間被回收
//Qvoid test(){ int* p = (int*)malloc(INT_MAX / 4); *p = 20;//如果p的值是NULL,就會(huì)有問(wèn)題 free(p); p=NULL;}
//Svoid test(){ int* p = (int*)malloc(INT_MAX / 4); if (p == NULL)//檢測(cè)是否開(kāi)辟成功 { exit(EXIT_FAILURE); } *p = 20; free(p); p=NULL;}
//Qvoid test(){ int* p = (int*)malloc(100); if (NULL != p) { *p = 20; }}int main(){ test(); while (1);}
S:開(kāi)辟的空間在未結(jié)束前,一直被占用,記得free
回收,別等程序退出自己回收。
//Qvoid test(){ int i = 0; int* p = (int*)malloc(10 * sizeof(int)); if (NULL == p) { exit(EXIT_FAILURE); } for (i = 0; i <= 10; i++) { *(p + i) = i;//當(dāng)i是10的時(shí)候越界訪問(wèn) } free(p); p=NULL;}
S:編譯器不能檢測(cè)出,得程序員自己格外注意。
//Qvoid test(){ int a = 10; int* p = &a; free(p);//err p=NULL;}
S:free
釋放堆上的空間
void test(){ int* p = (int*)malloc(100); p++;//p不再指向動(dòng)態(tài)內(nèi)存的起始位置 free(p);//err}
free
釋放一塊空間必須提供該空間的起始地址。
//Qvoid test(){ int *p = (int *)malloc(100); free(p); free(p);//err 重復(fù)釋放}
//Svoid test(){ int *p = (int *)malloc(100); free(p); p=NULL; free(p);//NULL啥都不干 p=NULL;}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/122558.html
摘要:棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。棧區(qū)主要存放運(yùn)行函數(shù)而分配的局部變量函數(shù)參數(shù)返回?cái)?shù)據(jù)返回地址等。 C語(yǔ)言動(dòng)態(tài)內(nèi)存分配篇 目錄 一、為什么存在動(dòng)態(tài)內(nèi)存管理/分配? ????????內(nèi)存的存儲(chǔ)形式劃分 二、動(dòng)態(tài)內(nèi)存函數(shù)的介紹 ????????malloc ...
摘要:本文主要介紹的數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單動(dòng)態(tài)字符串簡(jiǎn)稱。遵守字符串以空字符串結(jié)尾的慣例,保存的空字符串一個(gè)字節(jié)空間不計(jì)算在的屬性里面。添加空字符串到字符串末尾等操作,都是由函數(shù)自動(dòng)完成的,所以這個(gè)空字符對(duì)于使用者來(lái)說(shuō)完全是透明的。Redis是用ANSI C語(yǔ)言編寫(xiě)的,它是一個(gè)高性能的key-value數(shù)據(jù)庫(kù),它可以作用在數(shù)據(jù)庫(kù)、緩存和消息中間件。其中 Redis 鍵值對(duì)中的鍵都是 string 類型,而鍵...
摘要:釋放不完全導(dǎo)致內(nèi)存泄漏。既然把柔性數(shù)組放在動(dòng)態(tài)內(nèi)存管理一章,可見(jiàn)二者有必然的聯(lián)系。包含柔性數(shù)組的結(jié)構(gòu)用進(jìn)行動(dòng)態(tài)內(nèi)存分配,且分配的內(nèi)存應(yīng)大于結(jié)構(gòu)大小,以滿足柔性數(shù)組的預(yù)期。使用含柔性數(shù)組的結(jié)構(gòu)體,需配合以等動(dòng)態(tài)內(nèi)存分配函數(shù)。 ...
閱讀 1413·2021-10-14 09:43
閱讀 4306·2021-09-27 13:57
閱讀 4596·2021-09-22 15:54
閱讀 2634·2021-09-22 10:54
閱讀 2433·2021-09-22 10:02
閱讀 2156·2021-08-27 13:11
閱讀 895·2019-08-29 18:44
閱讀 1673·2019-08-29 15:20