C語(yǔ)言深度挖掘_第1頁(yè)
C語(yǔ)言深度挖掘_第2頁(yè)
C語(yǔ)言深度挖掘_第3頁(yè)
C語(yǔ)言深度挖掘_第4頁(yè)
C語(yǔ)言深度挖掘_第5頁(yè)
已閱讀5頁(yè),還剩36頁(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)介

1、.,C 語(yǔ)言的深度挖掘 (一),變量的表示與存儲(chǔ)問(wèn)題,.,是否入門?,.,改進(jìn),.,有錯(cuò)嗎?,.,為什么在每個(gè)頭文件都能見(jiàn)到,.,哪個(gè)執(zhí)行效率高?,.,浮點(diǎn)數(shù)的內(nèi)存表示問(wèn)題,.,無(wú)符號(hào)整數(shù)與有符號(hào)整數(shù),.,可以少傳一個(gè)參數(shù)嗎?,.,為什么有時(shí)相同有時(shí)不同?,12 15,12 12,改成char a10; 會(huì)輸出什么?,.,結(jié)構(gòu)體變量的內(nèi)存表示,.,聯(lián)合類型變量的內(nèi)存表示,.,實(shí)際應(yīng)用的例子,.,位域,.,應(yīng)用位域的例子段描述符,.,C/C+程序運(yùn)行時(shí)的內(nèi)存結(jié)構(gòu),全局變量、用static修飾的局部變量都存儲(chǔ)在靜態(tài)數(shù)據(jù)區(qū)。 程序指令和大部分字面常量都存儲(chǔ)在代碼區(qū)。 大部分函數(shù)的形參和局部變量都存儲(chǔ)

2、在棧區(qū)。 程序中動(dòng)態(tài)分配的內(nèi)存都存儲(chǔ)在堆區(qū)。 一小部分函數(shù)形參和局部變量存儲(chǔ)在CPU寄存器組中。,靜態(tài)數(shù)據(jù)區(qū),代碼區(qū),棧區(qū),堆區(qū),CPU寄存器組,常量數(shù)據(jù)區(qū),已初始化區(qū),未初始化區(qū),.,變量的生存期,把程序運(yùn)行時(shí)一個(gè)變量占有內(nèi)存空間的時(shí)間段稱為該變量的生存期。C+把變量的生存期分為:靜態(tài)、自動(dòng)和動(dòng)態(tài)三種。 靜態(tài)生存期:全局變量都具有靜態(tài)生存期,它們的內(nèi)存空間從程序開(kāi)始執(zhí)行時(shí)就進(jìn)行分配,直到程序結(jié)束才被收回。 自動(dòng)生存期:局部變量和函數(shù)形參一般都具有自動(dòng)生存期,它們的內(nèi)存空間在程序執(zhí)行到定義它們的復(fù)合語(yǔ)句(包括函數(shù)體)時(shí)才分配,當(dāng)定義它們的復(fù)合語(yǔ)句執(zhí)行結(jié)束時(shí)內(nèi)存被收回。 動(dòng)態(tài)生存期:具有動(dòng)態(tài)生存

3、期的變量的生存時(shí)間是由程序員自由控制的,其內(nèi)存空間用new操作符分配,用delete回收。 在定義局部變量時(shí),可以為它們加上存儲(chǔ)類修飾符auto、static和register來(lái)指出它們的生存期。 定義為static存儲(chǔ)類型的局部變量具有靜態(tài)生存期,它們也被存放在靜態(tài)數(shù)據(jù)區(qū)。,.,關(guān)鍵字volatile的作用,.,main函數(shù)為空居然也有輸出?,.,關(guān)鍵字extern的作用,.,系統(tǒng)棧與過(guò)程調(diào)用,局部變量 var_main,參數(shù) arg_A2 = 1,返回地址,其他信息,局部變量 var_A2,參數(shù) arg_B2=3,返回地址,其他信息,局部變量 var_A1,局部變量 var_B2,.,局部

4、變量 var_B1,.,棧底,棧頂,參數(shù)arg_A1= 2,參數(shù) arg_B1=4,func_B 的棧幀,func_A 的棧幀,main 的棧幀,.,有問(wèn)題嗎?,.,有問(wèn)題嗎?,.,輸出什么?,.,存儲(chǔ)位置是否相同?,.,輸出什么?,.,輸出什么?,.,常量成了變量?,.,堆內(nèi)存管理方法初探,int *p1 = (int*) malloc(sizeof(int); char *p2 = (char*) malloc(sizeof(char); free(p1) ; free(p2);,1000,大,自由內(nèi)存區(qū)表,占用內(nèi)存區(qū)表,.,堆內(nèi)存管理方法初探,int *p1 = (int*) mallo

5、c(sizeof(int); char *p2 = (char*) malloc(sizeof(char); free(p1) ; free(p2);,1000,大,自由內(nèi)存區(qū)表,占用內(nèi)存區(qū)表,.,堆內(nèi)存管理方法初探,int *p1 = (int*) malloc(sizeof(int); char *p2 = (char*) malloc(sizeof(char); free(p1) ; free(p2);,1000,大,自由內(nèi)存區(qū)表,占用內(nèi)存區(qū)表,100A,最先適配算法,最佳適配算法,.,堆內(nèi)存管理方法初探,int *p1 = (int*) malloc(sizeof(int); char

6、 *p2 = (char*) malloc(sizeof(char); free(p1) ; free(p2);,1000,大,自由內(nèi)存區(qū)表,占用內(nèi)存區(qū)表,100A,堆的緊縮問(wèn)題,.,堆內(nèi)存管理方法初探,int *p1 = (int*) malloc(sizeof(int); char *p2 = (char*) malloc(sizeof(char); free(p1) ; free(p2);,1000,大,自由內(nèi)存區(qū)表,占用內(nèi)存區(qū)表,100A,.,使用malloc和free的注意事項(xiàng),剛剛分配的動(dòng)態(tài)內(nèi)存的初始值是不確定的 不能對(duì)同一指針(地址) 連續(xù)兩次進(jìn)行free操作 不能對(duì)指向靜態(tài)內(nèi)存

7、區(qū)(全局變量)或棧內(nèi)存區(qū)(局部變量)的指針應(yīng)用free (但可以對(duì)空指針NULL應(yīng)用free)。 對(duì)一個(gè)指針應(yīng)用free之后,它的值不會(huì)改變,但它指向了一個(gè)無(wú)效的內(nèi)存區(qū),這時(shí)稱該指針為“懸空指針”。 如果沒(méi)有及時(shí)釋放某塊動(dòng)態(tài)內(nèi)存,并且將指向它的指針指向了別處,就會(huì)造成“內(nèi)存泄漏”。 執(zhí)行malloc和free函數(shù)有一定的代價(jià),所以對(duì)于較小的變量不應(yīng)該放在動(dòng)態(tài)內(nèi)存之中,并且盡量避免頻繁地分配和釋放動(dòng)態(tài)內(nèi)存。,.,使用堆內(nèi)存時(shí)的常見(jiàn)錯(cuò)誤,內(nèi)存分配未成功,卻使用了它。 內(nèi)存分配雖然成功,但是尚未初始化就引用它。(誤認(rèn)為初始值為0) 內(nèi)存分配成功并且已經(jīng)初始化,但操作越過(guò)了內(nèi)存的邊界。 忘記了釋放內(nèi)存

8、,造成內(nèi)存泄露。 釋放了內(nèi)存卻繼續(xù)使用它。,.,關(guān)于懸空指針,一個(gè)指針變量,如果不為NULL且沒(méi)有指向有效的內(nèi)存地址,都稱為“懸空指針” 通過(guò)懸空指針訪問(wèn)其指向的內(nèi)存區(qū)會(huì)使程序產(chǎn)生不可預(yù)知的錯(cuò)誤。 如何避免懸空指針: 定義指針變量時(shí)堅(jiān)持對(duì)其進(jìn)行正確的初始化 在用free或delete釋放內(nèi)存之后,應(yīng)及時(shí)將相應(yīng)的指針置為NULL,.,懸空指針的例子(一),void somefuncion() int *p; . *p = 7; . ,void somefuncion() int *p = NULL; /正確地進(jìn)行初始化 . *p = 7; . ,.,懸空指針的例子(二),int main() i

9、nt *p = NULL; p = (int*)malloc(sizeof(int); *p = 5; free(p); / do something *p = 7; printf(%d, *p); ,.,內(nèi)存泄漏的例子(一),void MyFunction(int nSize) char* p= new charnSize; if( !SomeFunc() ) printf(“Error”); return; /using the string pointed by p; delete p; ,.,內(nèi)存泄漏的例子(二),char *TransToEng(const char *inputStr) / 將中文翻譯成英文 char *outputStr = (char*) malloc( ); /* 翻譯 */ return outputStr; int main() char *chineseStr = 歡迎光臨; char *englishStr = TransToEng(歡迎光臨); printf(%s, englishStr); ,.,如何避免內(nèi)存泄漏,運(yùn)行檢測(cè)法 定義自己的ma

溫馨提示

  • 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)論