在C語言程序中,棧空間是由編譯器管理的,在程序中可以體現棧空間使用的例子是參數的傳遞、返回值的使用以及自動變量的空間。
在運行程序的系統中,棧空間是從高地址向低地址增長的。在程序的執行結果中打印參數的地址就可以看到參數地址的關系。
參數入棧的順序是:后面的參數在高地址處,前面的參數在低地址處。事實上,進入函數后,第一個參數將位于棧空間的最后。因此,程序在按照順序訪問參數的時候,還是從低地址到高地址的訪問。注意:具體參數將占用多大的棧區域空間,將由編譯器決定,因為入棧之前的棧指針和入棧之后的棧指針之間的內容不一定和參數大小的和一致。
在函數退出之后,棧指針將返回到函數進入之前的位置。從上面我們得出,在函數調用的過程中,每增加一個層次,都會讓程序需要更大的棧空間。
事實上,在函數的調用過程中,參數和返回值都將使用棧空間。棧空間的具體規模是和編譯器有關系的,可以確定的一點是:一般參數入棧后,前面的參數將位于內存的低地址,后面的參數將位于內存的高地址。
在程序中,函數內部使用的自動變量也是保存在棧區域的。編譯器在處理自動變量的時候,將在參數棧區的后面為自動變量分配棧區域。棧的開辟順序和參數的順序是一致的。
編譯器只會為函數內部的自動變量在棧上開辟空間,如果函數內部的變量改為靜態變量,這個時候編譯器就不會為這個變量在棧上開辟空間了,而是將它放入靜態的存儲區內。
程序中使用的自動局部變量和參數的類型都是C語言的基本類型,在32位的系統中,int為32位(4字節),這種變量類型將占用4個字節的棧空間。在程序中,可能使用較大的棧空間的變量類型是結構體和數組。
關于棧空間的使用,完全是由編譯器來處理的,在程序中不需要管理棧。當函數退出之后,函數棧上的內容將被釋放,因此,在函數跳出后,函數棧上的內容是不能被別的函數使用的。
內層函數可以使用外層函數的棧內存,但是外層函數不能使用內層函數的棧內存。
自動變量的地址不可以作為函數返回值,但是可以作為參數傳遞給其他函數。
審核編輯 :李倩
-
函數
+關注
關注
3文章
4333瀏覽量
62688 -
編譯器
+關注
關注
1文章
1634瀏覽量
49153 -
C程序
+關注
關注
4文章
254瀏覽量
36045
原文標題:C程序中棧空間的使用
文章出處:【微信號:gh_e7f294a514ca,微信公眾號:單片機匠人】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論