C語言深入講解棧與堆和靜態(tài)存儲區(qū)的使用_第1頁
C語言深入講解棧與堆和靜態(tài)存儲區(qū)的使用_第2頁
C語言深入講解棧與堆和靜態(tài)存儲區(qū)的使用_第3頁
C語言深入講解棧與堆和靜態(tài)存儲區(qū)的使用_第4頁
C語言深入講解棧與堆和靜態(tài)存儲區(qū)的使用_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論