版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、c語(yǔ)言中動(dòng)態(tài)內(nèi)存申請(qǐng)與釋放的簡(jiǎn)單理解c語(yǔ)言中動(dòng)態(tài)內(nèi)存申請(qǐng)與釋放的簡(jiǎn)單理解在C里,內(nèi)存管理是通過(guò)專門的函數(shù)來(lái)實(shí)現(xiàn)的。與c不同,在c中是通過(guò)new、delete函數(shù)動(dòng)態(tài)申請(qǐng)、釋 放內(nèi)存的。1、分配內(nèi)存 malloc函數(shù) 需要包含頭文件 include或 include 函數(shù)聲明函數(shù)原型 void *mallocint size;說(shuō)明 malloc 向系統(tǒng)申請(qǐng)分配指定 size個(gè)字節(jié)的內(nèi)存空間。返回類型是 void*類型。void*表示未確定類型的指針。C,C規(guī)定,void*類型可以強(qiáng)制轉(zhuǎn)換為任何其它類型的指 針。從函數(shù)聲明上可以看由。malloc和new至少有兩個(gè)不同new返回指定類型的指針,并且
2、可以自動(dòng)計(jì)算所需要大小。比如int *p; p new int; /返回類型為int*類型整數(shù)型指 針,分配大小為 sizeofint;或 int* parr; parr new int 100; 返回類型為int*類型整數(shù)型指針,分配大小為sizeofint *100;而malloc則必須由我們計(jì)算需要的字節(jié)數(shù),并且在返 回后強(qiáng)行轉(zhuǎn)換為實(shí)際類型的指針。int* p; p int * malloc sizeofint; 第一、malloc函數(shù)返回的是 void *類型,如果你寫成p不能將void*malloc sizeofint;則程序無(wú)法通過(guò)編譯,報(bào)錯(cuò)賦值給int *類型變量”。所以必須通過(guò)
3、int *來(lái)將強(qiáng)制轉(zhuǎn)換。第二、函數(shù)的實(shí)參為 sizeofint ,用于指明一個(gè)整型數(shù)據(jù)需 要的大小。如果你寫成int* p int * malloc 1;代碼也能通過(guò)編譯,但事實(shí)上只分配了 1個(gè)字節(jié)大小的內(nèi)存空間,當(dāng)你往里頭存 入一個(gè)整數(shù),就會(huì)有3個(gè)字節(jié)無(wú)家可歸,而直接住進(jìn)鄰居家” 造成的結(jié)果是后面的內(nèi)存中原有數(shù)據(jù)內(nèi)容全部被清空。malloc也可以達(dá)到new 口的效果,申請(qǐng)由一段連續(xù)的 內(nèi)存,方法無(wú)非是指定你所需要內(nèi)存大小。比如想分配100個(gè)int類型的空間 int* p int * malloc sizeofint * 100 ; /分配可以放得下100個(gè)整數(shù)的內(nèi)存空間。另外有一點(diǎn)不能直接看
4、生的區(qū)別是,malloc只管分配內(nèi)存,并不能對(duì)所得的內(nèi)存進(jìn)行初始化,所以得到的一片新 內(nèi)存中,具值將是隨機(jī)的。除了分配及最后釋放的方法不一樣以外,通過(guò) malloc 或new得到指針,在其它操作上保持一致。2、釋放內(nèi)存free函數(shù) 需要包含頭文件和 malloc 一樣 include 或 include 函數(shù)聲明 void freevoid *block;即 void free指針變量; 之所以把形參中的指針聲明為 void* ,是因?yàn)閒ree必須可以釋放任意類型的指針,而任意類型的指針 都可以轉(zhuǎn)換為void *。舉例 int* p int * malloc4; *p 100; freep;
5、釋 放 p所指的內(nèi)存空間 或者 int* p int * malloc sizeofint * 100 ; /分配可以放得下100個(gè)整數(shù)的內(nèi)存空間。freep; free不管你的指針指向多大的空間,均可以正確地進(jìn)行釋放,這一點(diǎn)釋放比delete/delete 口要方便。不過(guò),必須注意,如果你在分配指針時(shí),用的是 new或 new口,那么抱歉,當(dāng)你在釋放內(nèi)存時(shí),你并不能圖方便而使用free來(lái)釋放。反過(guò)來(lái),你用malloc分配的內(nèi)存,也不能用delete/delete口 來(lái)釋放。一句話, new/delete、new/delete、malloc/free 三對(duì)均 需配套使用,不可混用 int* p
6、 new int100; freep;/ERROR p是由new 所得。這也是我們必須學(xué)習(xí) malloc與free的重要理由之 一,有時(shí)候,我們調(diào)用操作系統(tǒng)的函數(shù)( Windows API)時(shí), 會(huì)遇到由我們的程序來(lái)分配內(nèi)存, API函數(shù)來(lái)釋放內(nèi)存;或 API函數(shù)來(lái)分配內(nèi)存,而我們的程序來(lái)負(fù)責(zé)釋放,這時(shí),必 須用malloc或free來(lái)進(jìn)行相應(yīng)的工作。3、重調(diào)空間的大小 realloc函數(shù)需要包含頭文件和 malloc 一 樣 include 或 include 函 數(shù)聲明 void*reallocvoid *block, int size; block 是指向要擴(kuò)張或縮小的 內(nèi)存空間的指針。
7、size指定新的大小。realloc可以對(duì)給定的指針?biāo)傅目臻g進(jìn)行擴(kuò)大或者縮 小。size是新的目標(biāo)大小。比如,原來(lái)空間大小是40個(gè)字節(jié),現(xiàn)在可以將size指定 為60,這樣就擴(kuò)張了 20個(gè)字節(jié);或者,將 size指定為20, 則等于將空間縮小了 20個(gè)字節(jié)。無(wú)論是擴(kuò)張或是縮小,原有內(nèi)存的中內(nèi)容將保持不變。 當(dāng)然,對(duì)于縮小,則被縮小的那一部分的內(nèi)容會(huì)丟失。舉例先用malloc分配一指針 int* p int * malloc sizeofint *10; 可以存放10個(gè)整數(shù)現(xiàn)在,由于些奧原因,我們需要向p所指的空間中存放15個(gè)整數(shù)原來(lái)的空 間不夠了 p int * realloc p, siz
8、eofint *15; 空間擴(kuò)張了 15 - 10 * sizeofint 20個(gè)字節(jié)接下來(lái),我們決定將 p所指內(nèi)存空間緊縮為 5個(gè)整數(shù)的大小 p int * realloc p, sizeofint * 5; / 縮小了 15 - 5 * sizeofint 40 個(gè)字節(jié) free p; 這么 看起來(lái),realloc有點(diǎn)像是施工隊(duì)對(duì)一個(gè)已建的房屋進(jìn)行改修 可以將房間后面再擴(kuò)建幾間,也可以拆掉幾間。不管是擴(kuò)還是拆,屋里原來(lái)的東西并不改變。不過(guò),這里要特別提醒一點(diǎn)這個(gè)施工隊(duì)有時(shí)會(huì)做這種事1、在一塊新的空地上新建一座指定大小的房屋;2、接著,將原來(lái)屋子里的東西原樣照搬到新屋;3、拆掉原來(lái)的屋子。這是什么指意呢realloc并不保證調(diào)整后的內(nèi)存空間和原來(lái)的內(nèi)存空間保持同一內(nèi)存地址。相反,realloc返回的指針很可能指向一個(gè)新的地址。所以,在代碼中,我們必須將 realloc返回的值,重新賦 值給 p p int * realloc p, sizeofint *15; 甚至,你可以傳 一個(gè)空指針(0)給realloc ,則此時(shí)realloc作用完全相當(dāng) 于
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高速公路合同制收費(fèi)員二零二五年度服務(wù)質(zhì)量監(jiān)督與反饋協(xié)議3篇
- 2025年度落水管安裝與水質(zhì)凈化服務(wù)合同4篇
- 二零二五年度木屋建造與木材加工工藝改進(jìn)合同4篇
- 咖啡館品牌形象包裝設(shè)計(jì)考核試卷
- 客運(yùn)站服務(wù)創(chuàng)新實(shí)踐考核試卷
- 2025版養(yǎng)老信托資金借款合同3篇
- 2025版電子商務(wù)合同爭(zhēng)議解決程序與法律適用合同4篇
- 二零二五年度軟件開(kāi)發(fā)與經(jīng)銷合同2篇
- 2025版學(xué)校教師培訓(xùn)與發(fā)展聘用合同樣本3篇
- 2025年外匯交易居間服務(wù)合同
- GB/T 16895.3-2024低壓電氣裝置第5-54部分:電氣設(shè)備的選擇和安裝接地配置和保護(hù)導(dǎo)體
- 計(jì)劃合同部部長(zhǎng)述職報(bào)告范文
- 窗簾采購(gòu)?fù)稑?biāo)方案(技術(shù)方案)
- 基于學(xué)習(xí)任務(wù)群的小學(xué)語(yǔ)文單元整體教學(xué)設(shè)計(jì)策略的探究
- 人教版高中物理必修一同步課時(shí)作業(yè)(全冊(cè))
- 食堂油鍋起火演練方案及流程
- 《呼吸衰竭的治療》
- 2024年度醫(yī)患溝通課件
- 2024年中考政治總復(fù)習(xí)初中道德與法治知識(shí)點(diǎn)總結(jié)(重點(diǎn)標(biāo)記版)
- 2024年手術(shù)室的應(yīng)急預(yù)案
- 五年級(jí)上冊(cè)小數(shù)除法豎式計(jì)算練習(xí)300題及答案
評(píng)論
0/150
提交評(píng)論