C語(yǔ)言深入講解棧與堆和靜態(tài)存儲(chǔ)區(qū)的使用_第1頁(yè)
C語(yǔ)言深入講解棧與堆和靜態(tài)存儲(chǔ)區(qū)的使用_第2頁(yè)
C語(yǔ)言深入講解棧與堆和靜態(tài)存儲(chǔ)區(qū)的使用_第3頁(yè)
C語(yǔ)言深入講解棧與堆和靜態(tài)存儲(chǔ)區(qū)的使用_第4頁(yè)
C語(yǔ)言深入講解棧與堆和靜態(tài)存儲(chǔ)區(qū)的使用_第5頁(yè)
已閱讀5頁(yè),還剩1頁(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)介

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

評(píng)論

0/150

提交評(píng)論