c語言中動態(tài)內(nèi)存申請與釋放的簡單理解.doc_第1頁
c語言中動態(tài)內(nèi)存申請與釋放的簡單理解.doc_第2頁
c語言中動態(tài)內(nèi)存申請與釋放的簡單理解.doc_第3頁
c語言中動態(tài)內(nèi)存申請與釋放的簡單理解.doc_第4頁
c語言中動態(tài)內(nèi)存申請與釋放的簡單理解.doc_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、c語言中動態(tài)內(nèi)存申請與釋放的簡單理解c語言中動態(tài)內(nèi)存申請與釋放的簡單理解在C里,內(nèi)存管理是通過專門的函數(shù)來實(shí)現(xiàn)的。與c不同,在c中是通過new、delete函數(shù)動態(tài)申請、釋 放內(nèi)存的。1、分配內(nèi)存 malloc函數(shù) 需要包含頭文件 include或 include 函數(shù)聲明函數(shù)原型 void *mallocint size;說明 malloc 向系統(tǒng)申請分配指定 size個字節(jié)的內(nèi)存空間。返回類型是 void*類型。void*表示未確定類型的指針。C,C規(guī)定,void*類型可以強(qiáng)制轉(zhuǎn)換為任何其它類型的指 針。從函數(shù)聲明上可以看由。malloc和new至少有兩個不同new返回指定類型的指針,并且

2、可以自動計算所需要大小。比如int *p; p new int; /返回類型為int*類型整數(shù)型指 針,分配大小為 sizeofint;或 int* parr; parr new int 100; 返回類型為int*類型整數(shù)型指針,分配大小為sizeofint *100;而malloc則必須由我們計算需要的字節(jié)數(shù),并且在返 回后強(qiáng)行轉(zhuǎn)換為實(shí)際類型的指針。int* p; p int * malloc sizeofint; 第一、malloc函數(shù)返回的是 void *類型,如果你寫成p不能將void*malloc sizeofint;則程序無法通過編譯,報錯賦值給int *類型變量”。所以必須通過

3、int *來將強(qiáng)制轉(zhuǎn)換。第二、函數(shù)的實(shí)參為 sizeofint ,用于指明一個整型數(shù)據(jù)需 要的大小。如果你寫成int* p int * malloc 1;代碼也能通過編譯,但事實(shí)上只分配了 1個字節(jié)大小的內(nèi)存空間,當(dāng)你往里頭存 入一個整數(shù),就會有3個字節(jié)無家可歸,而直接住進(jìn)鄰居家” 造成的結(jié)果是后面的內(nèi)存中原有數(shù)據(jù)內(nèi)容全部被清空。malloc也可以達(dá)到new 口的效果,申請由一段連續(xù)的 內(nèi)存,方法無非是指定你所需要內(nèi)存大小。比如想分配100個int類型的空間 int* p int * malloc sizeofint * 100 ; /分配可以放得下100個整數(shù)的內(nèi)存空間。另外有一點(diǎn)不能直接看

4、生的區(qū)別是,malloc只管分配內(nèi)存,并不能對所得的內(nèi)存進(jìn)行初始化,所以得到的一片新 內(nèi)存中,具值將是隨機(jī)的。除了分配及最后釋放的方法不一樣以外,通過 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個整數(shù)的內(nèi)存空間。freep; free不管你的指針指向多大的空間,均可以正確地進(jìn)行釋放,這一點(diǎn)釋放比delete/delete 口要方便。不過,必須注意,如果你在分配指針時,用的是 new或 new口,那么抱歉,當(dāng)你在釋放內(nèi)存時,你并不能圖方便而使用free來釋放。反過來,你用malloc分配的內(nèi)存,也不能用delete/delete口 來釋放。一句話, new/delete、new/delete、malloc/free 三對均 需配套使用,不可混用 int* p

6、 new int100; freep;/ERROR p是由new 所得。這也是我們必須學(xué)習(xí) malloc與free的重要理由之 一,有時候,我們調(diào)用操作系統(tǒng)的函數(shù)( Windows API)時, 會遇到由我們的程序來分配內(nèi)存, API函數(shù)來釋放內(nèi)存;或 API函數(shù)來分配內(nèi)存,而我們的程序來負(fù)責(zé)釋放,這時,必 須用malloc或free來進(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可以對給定的指針?biāo)傅目臻g進(jìn)行擴(kuò)大或者縮 小。size是新的目標(biāo)大小。比如,原來空間大小是40個字節(jié),現(xiàn)在可以將size指定 為60,這樣就擴(kuò)張了 20個字節(jié);或者,將 size指定為20, 則等于將空間縮小了 20個字節(jié)。無論是擴(kuò)張或是縮小,原有內(nèi)存的中內(nèi)容將保持不變。 當(dāng)然,對于縮小,則被縮小的那一部分的內(nèi)容會丟失。舉例先用malloc分配一指針 int* p int * malloc sizeofint *10; 可以存放10個整數(shù)現(xiàn)在,由于些奧原因,我們需要向p所指的空間中存放15個整數(shù)原來的空 間不夠了 p int * realloc p, siz

8、eofint *15; 空間擴(kuò)張了 15 - 10 * sizeofint 20個字節(jié)接下來,我們決定將 p所指內(nèi)存空間緊縮為 5個整數(shù)的大小 p int * realloc p, sizeofint * 5; / 縮小了 15 - 5 * sizeofint 40 個字節(jié) free p; 這么 看起來,realloc有點(diǎn)像是施工隊對一個已建的房屋進(jìn)行改修 可以將房間后面再擴(kuò)建幾間,也可以拆掉幾間。不管是擴(kuò)還是拆,屋里原來的東西并不改變。不過,這里要特別提醒一點(diǎn)這個施工隊有時會做這種事1、在一塊新的空地上新建一座指定大小的房屋;2、接著,將原來屋子里的東西原樣照搬到新屋;3、拆掉原來的屋子。這是什么指意呢realloc并不保證調(diào)整后的內(nèi)存空間和原來的內(nèi)存空間保持同一內(nèi)存地址。相反,realloc返回的指針很可能指向一個新的地址。所以,在代碼中,我們必須將 realloc返回的值,重新賦 值給 p p int * realloc p, sizeofint *15; 甚至,你可以傳 一個空指針(0)給realloc ,則此時realloc作用完全相當(dāng) 于

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論