




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C語(yǔ)言深入講解棧與堆和靜態(tài)存儲(chǔ)區(qū)的使用目錄一、程序中的棧二、函數(shù)的調(diào)用過(guò)程三、函數(shù)調(diào)用的棧變化四、函數(shù)調(diào)用棧上的數(shù)據(jù)五、程序中的堆六、程序中的靜態(tài)存儲(chǔ)區(qū)七、小結(jié)
一、程序中的棧
棧是現(xiàn)代計(jì)算機(jī)程序里最為重要的概念之一棧在程序中用于維護(hù)函數(shù)調(diào)用上下文函數(shù)中的參數(shù)和局部變量存儲(chǔ)在棧上
棧保存了一個(gè)函數(shù)調(diào)用所需的維護(hù)信息
參數(shù)返回地址局部變量調(diào)用上下文
二、函數(shù)的調(diào)用過(guò)程
每次函數(shù)調(diào)用都對(duì)應(yīng)著一個(gè)棧上的活動(dòng)記錄
調(diào)用函數(shù)的活動(dòng)記錄位于棧的中部被調(diào)函數(shù)的活動(dòng)記錄位于棧的頂部
三、函數(shù)調(diào)用的棧變化
從main()開(kāi)始運(yùn)行
main()調(diào)用f()
當(dāng)從f()調(diào)用中返回main()
四、函數(shù)調(diào)用棧上的數(shù)據(jù)
函數(shù)調(diào)用時(shí),對(duì)應(yīng)的棧空間在函數(shù)返回前是專用的函數(shù)調(diào)用結(jié)束后,??臻g將被釋放,數(shù)據(jù)不再有效
下面看一個(gè)指向棧數(shù)據(jù)的指針:
#includestdio.h
int*g()
inta[10]={0};
returna;
voidf()
inti=0;
intb[10]={0,1,2,3,4,5,6,7,8,9};
int*pointer=g();
for(i=0;ii++)
b[i]=pointer[i];
for(i=0;ii++)
printf("%d\n",b[i]);
intmain()
f();
return0;
}
輸出結(jié)果如下:
如果把
for(i=0;ii++)
{
b[i]=pointer[i];
}
注釋了,直接打印pointer[i]里面的數(shù)據(jù),如下:
#includestdio.h
int*g()
inta[10]={0};
returna;
voidf()
inti=0;
intb[10]={0,1,2,3,4,5,6,7,8,9};
int*pointer=g();
for(i=0;ii++)
b[i]=pointer[i];
for(i=0;ii++)
printf("%d\n",pointer[i]);
intmain()
f();
return0;
}
輸出結(jié)果如下:
為什么直接打印pointer[i]里面的值會(huì)是這樣呢?因?yàn)閜ointer指向的空間是??臻g,??臻g在g()函數(shù)返回之后,活動(dòng)記錄就被釋放了。被釋放后調(diào)用printf函數(shù),printf函數(shù)需要在棧上面建立一個(gè)活動(dòng)記錄。這個(gè)活動(dòng)記錄就會(huì)有printf函數(shù)的參數(shù)信息和返回值等,所以pointer所指向的內(nèi)存里面的數(shù)據(jù)由于printf函數(shù)的調(diào)用被改變了。因此,不能返回局部變量的地址,不能返回局部數(shù)組的數(shù)組名。
五、程序中的堆
堆是程序中一塊預(yù)留的內(nèi)存空間,可由程序自由使用堆中被程序申請(qǐng)使用的內(nèi)存在被主動(dòng)釋放前將一直有效
為什么有了棧還需要堆
答:棧上的數(shù)據(jù)在函數(shù)返回后就會(huì)被釋放掉,無(wú)法傳遞到函數(shù)外部,如:局部數(shù)組
C語(yǔ)言程序中通過(guò)庫(kù)函數(shù)的調(diào)用獲得堆空間
頭文件:malloc.hmalloc--以字節(jié)的方式動(dòng)態(tài)申請(qǐng)堆空間free--將堆空間歸還給系統(tǒng)
系統(tǒng)對(duì)堆空間的管理方式
空閑鏈表法,位圖法,對(duì)象池法等等
以int*p=(int*)malloc(sizeof(int));為例,要申請(qǐng)4個(gè)字節(jié)的大小,遍歷之后發(fā)現(xiàn)跟5Bytes這個(gè)節(jié)點(diǎn)最接近,找到一個(gè)可以用的單元之后,就將這個(gè)單元的地址返還給了p指針。以前也提過(guò)使用malloc申請(qǐng)內(nèi)存空間時(shí)返回的內(nèi)存空間可能比申請(qǐng)的實(shí)際內(nèi)存空間要大一點(diǎn)點(diǎn),原因就是在空閑鏈表管理堆空間這樣的系統(tǒng)里面,它會(huì)找最近的那個(gè),找到后的一般都大于等于所需要的內(nèi)存空間,假如5Bytes這個(gè)節(jié)點(diǎn)下所有的空閑內(nèi)存單元都用完的話,就會(huì)找12Bytes節(jié)點(diǎn)下的內(nèi)存單元,這樣malloc返回的內(nèi)存空間就有可能比自己實(shí)際申請(qǐng)的內(nèi)存空間要大。
六、程序中的靜態(tài)存儲(chǔ)區(qū)
靜態(tài)存儲(chǔ)區(qū)隨著程序的運(yùn)行而分配空間靜態(tài)存儲(chǔ)區(qū)的生命周期直到程序運(yùn)行結(jié)束在程序的編譯期靜態(tài)存儲(chǔ)區(qū)的大小就已經(jīng)確定靜態(tài)存儲(chǔ)區(qū)主要用于保存全局變量和靜態(tài)局部變量靜態(tài)存儲(chǔ)區(qū)的信息最終會(huì)保存到可執(zhí)行程序中
下面看一個(gè)靜態(tài)存儲(chǔ)區(qū)的驗(yàn)證代碼:
#includestdio.h
intg_v=1;
staticintg_vs=2;
voidf()
staticintg_vl=3;
printf("%p\n",g_vl);
intmain()
printf("%p\n",g_v);
printf("%p\n",g_vs);
f();
return0;
}
輸出結(jié)果如下:
可以看到這三個(gè)地址是順序存放的,因?yàn)檫@三個(gè)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 全方位醫(yī)療道德責(zé)任精確化的數(shù)據(jù)處理
- 中學(xué)線上教學(xué)工作總結(jié)模版
- AI技術(shù)在醫(yī)學(xué)研究中的應(yīng)用及挑戰(zhàn)探討
- 醫(yī)療糾紛解決中的法律責(zé)任與策略
- 醫(yī)療健康產(chǎn)業(yè)鏈與京味文化的結(jié)合點(diǎn)分析
- 辦公效率提升的人工智能技術(shù)探索與應(yīng)用實(shí)踐案例分享
- ktv合伙投資合同范例
- 醫(yī)療物資供應(yīng)鏈的穩(wěn)定與安全管理探索
- 鄉(xiāng)村振興規(guī)劃合同范例
- 區(qū)塊鏈技術(shù)引領(lǐng)教育管理革新
- 《農(nóng)村基層干部廉潔履行職責(zé)規(guī)定》解讀與培訓(xùn)
- 無(wú)處不在-傳染病知到智慧樹(shù)章節(jié)測(cè)試課后答案2024年秋南昌大學(xué)
- 【MOOC】國(guó)際交英文寫(xiě)作-湖南大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 初中八年級(jí)英語(yǔ)課件the Leaning Tower of Pisa
- 西昌旅游資源介紹課件
- 部編版小學(xué)語(yǔ)文二年級(jí)下冊(cè)教師教學(xué)用書(shū)
- 健康體檢的重大意義共35張課件
- 重大活動(dòng)公共衛(wèi)生安全監(jiān)督保障課件
- 電解質(zhì)溶液導(dǎo)電性影響因素的探究
- GB∕T 13554-2020 高效空氣過(guò)濾器
- 客戶性格色彩分析
評(píng)論
0/150
提交評(píng)論