真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

動(dòng)態(tài)內(nèi)存分配相關(guān)函數(shù)-創(chuàng)新互聯(lián)

以下是內(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

malloc 函數(shù)介紹

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)查看詳情吧


新聞標(biāo)題:動(dòng)態(tài)內(nèi)存分配相關(guān)函數(shù)-創(chuàng)新互聯(lián)
新聞來源:http://weahome.cn/article/dojdjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部