c語(yǔ)言開(kāi)發(fā)入門(mén)及項(xiàng)目實(shí)戰(zhàn)課件第14章存儲(chǔ)管理_第1頁(yè)
c語(yǔ)言開(kāi)發(fā)入門(mén)及項(xiàng)目實(shí)戰(zhàn)課件第14章存儲(chǔ)管理_第2頁(yè)
c語(yǔ)言開(kāi)發(fā)入門(mén)及項(xiàng)目實(shí)戰(zhàn)課件第14章存儲(chǔ)管理_第3頁(yè)
c語(yǔ)言開(kāi)發(fā)入門(mén)及項(xiàng)目實(shí)戰(zhàn)課件第14章存儲(chǔ)管理_第4頁(yè)
c語(yǔ)言開(kāi)發(fā)入門(mén)及項(xiàng)目實(shí)戰(zhàn)課件第14章存儲(chǔ)管理_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

存儲(chǔ)管理

教學(xué)目的內(nèi)容1

教學(xué)要求2

重點(diǎn)難點(diǎn)3

教學(xué)內(nèi)容4教學(xué)目的通過(guò)本章的學(xué)習(xí),了解內(nèi)存的組織結(jié)構(gòu),了解堆和棧的不同,掌握使用動(dòng)態(tài)管理內(nèi)存的函數(shù),了解內(nèi)存在什么情況會(huì)丟失。教學(xué)要求了解內(nèi)存組織方式;區(qū)分堆和棧的不同;掌握動(dòng)態(tài)管理所用函數(shù);了解內(nèi)存丟失情況。重點(diǎn)難點(diǎn)重點(diǎn):內(nèi)存的組織方式

;

動(dòng)態(tài)管理函數(shù)。難點(diǎn):內(nèi)存丟失動(dòng)態(tài)管理函數(shù)教學(xué)內(nèi)容內(nèi)存丟失。內(nèi)存組織形式;動(dòng)態(tài)管理

;內(nèi)存組織方式1.內(nèi)存的組織方式開(kāi)發(fā)人員將程序編寫(xiě)完成之后,程序要先裝載到計(jì)算機(jī)的內(nèi)核或者半導(dǎo)體內(nèi)存中,然后再運(yùn)行程序。程序被組織成4個(gè)邏輯段:(1)可執(zhí)行代碼(2)靜態(tài)數(shù)據(jù)可執(zhí)行代碼和靜態(tài)數(shù)據(jù),存儲(chǔ)在固定的內(nèi)存位置。(3)動(dòng)態(tài)數(shù)據(jù)(堆)程序請(qǐng)求動(dòng)態(tài)分配的內(nèi)存來(lái)自?xún)?nèi)存池,也就是上面所列舉中的堆。(4)棧局部數(shù)據(jù)對(duì)象、函數(shù)的參數(shù)以及調(diào)用函數(shù)和被調(diào)用函數(shù)的聯(lián)系放在稱(chēng)為棧的內(nèi)存池中。但是以上的4類(lèi)根據(jù)操作平臺(tái)和編譯器的不同,堆和棧可以是被所有同時(shí)運(yùn)行的程序共享的操作系統(tǒng)資源,也可以是使用程序獨(dú)占的局部資源。內(nèi)存組織方式

2.堆與棧在內(nèi)存組織方式可以看到堆是用來(lái)存放動(dòng)態(tài)分配內(nèi)存空間的,而棧是用來(lái)存放局部數(shù)據(jù)對(duì)象、函數(shù)的參數(shù)、調(diào)用函數(shù)和被調(diào)用函數(shù)的聯(lián)系。接下來(lái)對(duì)兩者進(jìn)行詳細(xì)的說(shuō)明。(1)堆在內(nèi)存的全局存儲(chǔ)空間當(dāng)中,用于程序動(dòng)態(tài)分配和釋放的內(nèi)存塊稱(chēng)為自由存儲(chǔ)空間,通常也稱(chēng)之為堆。(2)棧程序不會(huì)像處理堆那樣的在棧中顯示地分配內(nèi)存。當(dāng)程序調(diào)用函數(shù)和聲明局部變量時(shí),系統(tǒng)將自動(dòng)分配內(nèi)存。棧是一個(gè)后進(jìn)先出的壓入彈出式的數(shù)據(jù)結(jié)構(gòu)。在程序運(yùn)行時(shí),是每次向棧中壓入一個(gè)對(duì)象,然后棧指針向下移動(dòng)一個(gè)位置。當(dāng)系統(tǒng)從棧中彈出一個(gè)對(duì)象時(shí),最近進(jìn)棧的對(duì)象將被彈出,然后棧指針向上移動(dòng)一個(gè)位置。如果棧指針位于棧頂,表示棧是空的;如果棧指針指向最下面的數(shù)據(jù)項(xiàng)的后一個(gè)位置,表示棧為滿的。動(dòng)態(tài)管理

1.malloc函數(shù)其函數(shù)的原型如下:void*malloc(unsignedintsize);在stdlib.h頭文件中包含該函數(shù),作用是在內(nèi)存中動(dòng)態(tài)的分配一塊size大小的內(nèi)存空間。malloc函數(shù)會(huì)返回一個(gè)指針,該指針指向分配的內(nèi)存空間,如果出現(xiàn)錯(cuò)誤返回NULL。例如使用該函數(shù)分配一個(gè)整型內(nèi)存空間:int*pInt;pInt=(int*)malloc(sizeof(int));首先定義指針pInt用來(lái)保存分配內(nèi)存的地址。在使用malloc函數(shù)分配內(nèi)存空間時(shí),需要指定具體的內(nèi)存空間的大小(size),這時(shí)調(diào)用函數(shù)sizeof就可以得到指定類(lèi)型的大小。malloc成功分配內(nèi)存空間后會(huì)返回一個(gè)指針,因?yàn)榉峙涞氖且粋€(gè)int型空間,所以在返回指針時(shí)也應(yīng)該是相對(duì)應(yīng)的int型指針,這樣的話就要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)化。最后將函數(shù)返回的指針賦值給指針pInt就可以保存動(dòng)態(tài)分配的整型空間地址了。動(dòng)態(tài)管理2.calloc函數(shù)其函數(shù)的原型如下:void*calloc(unsignedn,unsignedsize);使用該函數(shù)也要包含頭文件stdlib.h,該函數(shù)的功能是在內(nèi)存中動(dòng)態(tài)分配n個(gè)長(zhǎng)度為size的連續(xù)內(nèi)存空間數(shù)組。calloc函數(shù)會(huì)返回一個(gè)指針,該指針指向動(dòng)態(tài)分配的連續(xù)內(nèi)存空間地址。當(dāng)分配空間錯(cuò)誤時(shí),返回NULL。例如使用該函數(shù)分配一個(gè)整型數(shù)組內(nèi)存空間:int*pArray; /*定義指針*/pArray=(int*)calloc(3,sizeof(int)); /*分配內(nèi)存數(shù)組*/在上面的代碼中pArray為一個(gè)整型指針,使用calloc分配內(nèi)存數(shù)組,在參數(shù)中第一個(gè)參數(shù)表示分配數(shù)組中元素的個(gè)數(shù),而第二個(gè)參數(shù)表示元素的類(lèi)型。最后將返回的指針賦給pArray指針變量,pArray指向的就是該數(shù)組的首地址。動(dòng)態(tài)管理

3.realloc函數(shù)其函數(shù)的原型如下:void*realloc(void*ptr,size_tsize);首先使用該函數(shù)要包含頭文件stdlib.h,其功能是改變ptr指針指向的空間大小為size大小。設(shè)定的size大小可以是任意的,也就是說(shuō)可以比原來(lái)的數(shù)值大,也可以比原來(lái)的數(shù)值小。返回值是一個(gè)指向新地址的指針,如果出現(xiàn)錯(cuò)誤則返回NULL。例如改變一個(gè)分配的實(shí)型的空間大小成為整型大小:fDouble=(double*)malloc(sizeof(double));iInt=realloc(fDouble,sizeof(int));其中fDouble是指向分配的實(shí)型空間,之后使用的是realloc函數(shù)改變fDouble指向的空間的大小,其大小設(shè)置為整型,然后將改變后的內(nèi)存空間的地址返回賦值給iInt整型指針。動(dòng)態(tài)管理4.free函數(shù)其函數(shù)的原型如下:voidfree(void*ptr);該函數(shù)的功能使用由指針ptr指向的內(nèi)存區(qū),使部分內(nèi)存區(qū)能被其他變量使用。ptr是最近一次調(diào)用calloc或malloc函數(shù)時(shí)返回的值。free函數(shù)無(wú)返回值。例如釋放一個(gè)分配整型變量的內(nèi)存空間:free(pInt);代碼中pInt為一個(gè)指向一個(gè)整型大小的內(nèi)存空間,使用free將其進(jìn)行釋放。

內(nèi)存丟失

在使用malloc等函數(shù)分配內(nèi)存后,要對(duì)其使用free函數(shù)進(jìn)行釋放。因?yàn)閮?nèi)存不進(jìn)行釋放會(huì)造成內(nèi)存遺漏可能會(huì)系統(tǒng)崩潰。因?yàn)閒ree函數(shù)的用處在于實(shí)時(shí)的執(zhí)行回收內(nèi)存的操作,如果程序很簡(jiǎn)單,那么不用寫(xiě)free函數(shù)去釋放內(nèi)存也可以,當(dāng)程序結(jié)束之前也不會(huì)使用很多的內(nèi)存,不會(huì)降低系統(tǒng)的性能。當(dāng)程序結(jié)束后,操作系統(tǒng)會(huì)將完成釋放的功能。但是如果在開(kāi)發(fā)大型程序時(shí),不寫(xiě)free函數(shù)去釋放內(nèi)存是很?chē)?yán)重的。因?yàn)楹芸赡茉诔绦蛑幸貜?fù)一萬(wàn)次分配10M的內(nèi)存,那么每次進(jìn)行分配內(nèi)存后都使用free函數(shù)去釋放用完的內(nèi)存空間,那么這個(gè)程序只需要使用10M內(nèi)存就可以運(yùn)行。但是如果不使用free函數(shù),那么程序就要使用100G的內(nèi)存!因?yàn)檫@其中包括絕大部分的虛擬內(nèi)存,而由于虛擬內(nèi)存的操作是需要讀寫(xiě)磁盤(pán),因此,這樣會(huì)極大的影響到系統(tǒng)的性能,系統(tǒng)因此可能崩潰。所以在程序中編寫(xiě)malloc分配內(nèi)存時(shí)都對(duì)應(yīng)的寫(xiě)出一個(gè)free函數(shù)進(jìn)行釋放是一個(gè)良好的編程習(xí)慣,這不但體現(xiàn)在處理大型程序時(shí)的必要性,并能在一定程度上體現(xiàn)了程序優(yōu)美的風(fēng)格和健壯性。內(nèi)存丟失但是有些時(shí)候,常常會(huì)有將內(nèi)存丟失的情況,例如:pOld=(int*)malloc(sizeof(int));pNew=(int*)malloc(sizeof(int));這兩段代碼分別表示了創(chuàng)建了一塊內(nèi)存,并且將內(nèi)存的地址傳給了指針pOld和pNew。此時(shí)指針pOld和pNew分別指向兩塊內(nèi)存。如果進(jìn)行這樣的操作:pOld=pNew;進(jìn)行這樣的操作后,那

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論