




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第C語言深入講解棧與堆和靜態(tài)存儲區(qū)的使用目錄一、程序中的棧二、函數(shù)的調用過程三、函數(shù)調用的棧變化四、函數(shù)調用棧上的數(shù)據(jù)五、程序中的堆六、程序中的靜態(tài)存儲區(qū)七、小結
一、程序中的棧
棧是現(xiàn)代計算機程序里最為重要的概念之一棧在程序中用于維護函數(shù)調用上下文函數(shù)中的參數(shù)和局部變量存儲在棧上
棧保存了一個函數(shù)調用所需的維護信息
參數(shù)返回地址局部變量調用上下文
二、函數(shù)的調用過程
每次函數(shù)調用都對應著一個棧上的活動記錄
調用函數(shù)的活動記錄位于棧的中部被調函數(shù)的活動記錄位于棧的頂部
三、函數(shù)調用的棧變化
從main()開始運行
main()調用f()
當從f()調用中返回main()
四、函數(shù)調用棧上的數(shù)據(jù)
函數(shù)調用時,對應的??臻g在函數(shù)返回前是專用的函數(shù)調用結束后,??臻g將被釋放,數(shù)據(jù)不再有效
下面看一個指向棧數(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;
}
輸出結果如下:
如果把
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;
}
輸出結果如下:
為什么直接打印pointer[i]里面的值會是這樣呢?因為pointer指向的空間是??臻g,??臻g在g()函數(shù)返回之后,活動記錄就被釋放了。被釋放后調用printf函數(shù),printf函數(shù)需要在棧上面建立一個活動記錄。這個活動記錄就會有printf函數(shù)的參數(shù)信息和返回值等,所以pointer所指向的內存里面的數(shù)據(jù)由于printf函數(shù)的調用被改變了。因此,不能返回局部變量的地址,不能返回局部數(shù)組的數(shù)組名。
五、程序中的堆
堆是程序中一塊預留的內存空間,可由程序自由使用堆中被程序申請使用的內存在被主動釋放前將一直有效
為什么有了棧還需要堆
答:棧上的數(shù)據(jù)在函數(shù)返回后就會被釋放掉,無法傳遞到函數(shù)外部,如:局部數(shù)組
C語言程序中通過庫函數(shù)的調用獲得堆空間
頭文件:malloc.hmalloc--以字節(jié)的方式動態(tài)申請堆空間free--將堆空間歸還給系統(tǒng)
系統(tǒng)對堆空間的管理方式
空閑鏈表法,位圖法,對象池法等等
以int*p=(int*)malloc(sizeof(int));為例,要申請4個字節(jié)的大小,遍歷之后發(fā)現(xiàn)跟5Bytes這個節(jié)點最接近,找到一個可以用的單元之后,就將這個單元的地址返還給了p指針。以前也提過使用malloc申請內存空間時返回的內存空間可能比申請的實際內存空間要大一點點,原因就是在空閑鏈表管理堆空間這樣的系統(tǒng)里面,它會找最近的那個,找到后的一般都大于等于所需要的內存空間,假如5Bytes這個節(jié)點下所有的空閑內存單元都用完的話,就會找12Bytes節(jié)點下的內存單元,這樣malloc返回的內存空間就有可能比自己實際申請的內存空間要大。
六、程序中的靜態(tài)存儲區(qū)
靜態(tài)存儲區(qū)隨著程序的運行而分配空間靜態(tài)存儲區(qū)的生命周期直到程序運行結束在程序的編譯期靜態(tài)存儲區(qū)的大小就已經確定靜態(tài)存儲區(qū)主要用于保存全局變量和靜態(tài)局部變量靜態(tài)存儲區(qū)的信息最終會保存到可執(zhí)行程序中
下面看一個靜態(tài)存儲區(qū)的驗證代碼:
#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;
}
輸出結果如下:
可以看到這三個地址是順序存放的,因為這三個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 共享汽車項目投資計劃書
- 空調出租合同協(xié)議書圖片
- 股份轉讓合同協(xié)議書模板
- 廣告標書維修服務方案
- 企業(yè)數(shù)字化轉型的戰(zhàn)略規(guī)劃與實施案例
- 中國聚烯烴熱塑性彈性體項目投資計劃書
- 物流分站加盟合同協(xié)議書
- 就業(yè)協(xié)議書是勞動合同
- 健身工作室好評文案
- 制作合同協(xié)議書原聲視頻
- 安徽省天一大聯(lián)考2025年高三最后一卷化學試題及答案
- 2025屆上海市普通中學三校聯(lián)考生物高二下期末達標測試試題含解析
- WPS考試內容全面解讀試題及答案
- 鷹眼無人機商業(yè)計劃書
- 第七單元 第2課時 觀察運動中的物體(大單元教學設計) 一年級數(shù)學下冊 (蘇教版2025)
- 北京市煙草專賣局(公司)筆試試題2024
- 創(chuàng)傷急救知識的試題及答案詳解
- 游泳館安全運營管理措施
- 2025年度6深圳中考數(shù)學考點、知識點的總結模版
- 2025年全國國家版圖知識競賽題庫及答案題(中小學組)
- 2025年廣東省深圳市福田區(qū)中考二模歷史試題(含答案)
評論
0/150
提交評論