以下是內(nèi)存分布圖。
創(chuàng)新互聯(lián)建站是一家專業(yè)提供萍鄉(xiāng)企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、H5場景定制、小程序制作等業(yè)務(wù)。10年已為萍鄉(xiāng)眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。我們可以自己在堆區(qū)申請(qǐng),釋放空間。其函數(shù)頭文件為#include
1.malloc函數(shù)原型,默認(rèn)返回void*,參數(shù)是要申請(qǐng)多少個(gè)字節(jié)
2. 函數(shù)返回值
若開辟成功,則返回被分配的內(nèi)存的指針,若不成功,則返回空指針NULL
但注意,返回的void*指針無法解引用,所以要將其強(qiáng)制類型轉(zhuǎn)換成我們所需要的指針類型,再用一個(gè)指針接收
例如:?int* p = (int*) malloc(40)
3.使用的注意事項(xiàng)
空間用完以后記得要用free釋放空間,并且將用于接收的指針指向空指針NULL,
因?yàn)閒ree會(huì)將空間的內(nèi)容釋放,也就是之前的內(nèi)容不存在了,但是指針p依然記住了地址,如果后續(xù)用到的指針p就是在使用野指針,會(huì)越界訪問,出現(xiàn)問題。
calloc函數(shù)介紹1.calloc函數(shù)原型
與malloc不同的地方在于參數(shù),calloc(需要申請(qǐng)的個(gè)數(shù),每個(gè)的占的字節(jié)數(shù))
void* calloc(size_t num ,size_t size)
int* p = (int*) malloc(4*sizeof(int)) 相當(dāng)于 int* p = (int*)calloc(10,sizeof(int))
與malloc不同的第二個(gè)地方在于,calloc函數(shù)會(huì)將開辟的空間初始化為0,malloc則不初始化
realloc函數(shù)介紹1.函數(shù)作用
在已經(jīng)用malloc或calloc開辟的空間上,再添加空間
2.realloc函數(shù)原型
第一個(gè)參數(shù)為已開辟空間的地址,第二個(gè)參數(shù)為原來空間的大小+還需開辟的大小(字節(jié))
3.使用注意事項(xiàng)
realloc使用的時(shí)候有三種情況
1.realloc 時(shí)其地址后的空間夠用,如圖
2.realloc 時(shí)其地址后的空間不夠用,因?yàn)榭赡芸臻g已經(jīng)被開辟使用,如圖
所以此時(shí)就要另尋空間,如圖
可以看到realloc函數(shù)放棄了先前的地址,在箭頭所指的合適的空間,把原有的內(nèi)容拷貝過來,在其后增加我們想要的空間,然后把先前的地址free掉,返回箭頭所指的地址。
這兩種情況用以下代碼是沒問題的,因?yàn)榉凑齬ealloc函數(shù)返回的都是有效地址
int main()
{
int* p = (int*)malloc(40);
p = (int*)realloc(p, 40);
return 0;
}
3.?realloc 時(shí)其地址后的空間不夠用,因?yàn)榭臻g已經(jīng)被開辟使用,并且在別處也找不到合適的空間,如圖
realloc找不到合適的空間,于是調(diào)整大小,并返回一個(gè)空指針NULL,這時(shí)候我們再用上面的方法接收就十分危險(xiǎn),因?yàn)椴粌H開辟空間失敗,還把原來的地址變成NULL,丟了西瓜也丟了芝麻。
因此用以下方法,先對(duì)realloc返回值是否為空指針進(jìn)行判斷,就顯得更加安全。
------------------------------------------------------分割線----------------------------------------------------------------
小練習(xí)想要避免此類錯(cuò)誤,牢記以下格式
1.malloc開辟空間
2.創(chuàng)造指針接收,例如:int* p = (int*) malloc(40)?
3.使用完后記得free,free(p)
4.指針也要置空,p = NULL
第一題:
錯(cuò)誤1:因?yàn)閭鞯氖莝tr,不是傳str的地址,相當(dāng)于傳值,p只是str的一份臨時(shí)拷貝,不會(huì)影響到str
錯(cuò)誤2:指針p用完沒有free
正確寫法如下圖
第二題:
x是局部變量,出了該局部,x所開辟的空間就會(huì)立即被free,所以就算會(huì)返回局部變量x的地址,如果再去訪問該地址就會(huì)出問題,因?yàn)樵摰刂匪淼目臻g已經(jīng)被free了
第三題:
指針ptr沒有初始化,是個(gè)野指針,后續(xù)進(jìn)行解引用操作就會(huì)越界訪問。
所以我們用指針的時(shí)候,要么就初始化,要么置為NULL
第四題:
補(bǔ)充一個(gè)知識(shí)點(diǎn),在棧區(qū)的變量出了局部會(huì)被操作系統(tǒng)自動(dòng)free,而在堆區(qū)的變量不會(huì)(是由程序員自己手動(dòng)free)
錯(cuò)誤:首先,可以看到char p[ ] 是個(gè)數(shù)組,p在棧區(qū)開辟了一塊空間。
隨后return p,但出了該局部,p所開辟的空間就會(huì)立即被free,所以就算會(huì)返回局部變量p的地址,如果再去訪問該地址就會(huì)出問題,因?yàn)樵摰刂匪淼目臻g已經(jīng)被free了,如下圖
修改:Getmemory函數(shù)里用上malloc就好,出了局部不會(huì)被系統(tǒng)free
第五題:
錯(cuò)誤1:指針str沒有置為NULL
錯(cuò)誤2:free的時(shí)機(jī)太早,導(dǎo)致越界訪問
以上就是個(gè)人對(duì)一些內(nèi)存函數(shù)的理解,希望對(duì)大家有幫助。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧