在C語言程序中,棧空間是由編譯器管理的,在程序中可以體現(xiàn)棧空間使用的例子是參數(shù)的傳遞、返回值的使用以及自動變量的空間。
在運行程序的系統(tǒng)中,棧空間是從高地址向低地址增長的。在程序的執(zhí)行結果中打印參數(shù)的地址就可以看到參數(shù)地址的關系。
參數(shù)入棧的順序是:后面的參數(shù)在高地址處,前面的參數(shù)在低地址處。事實上,進入函數(shù)后,第一個參數(shù)將位于棧空間的最后。因此,程序在按照順序訪問參數(shù)的時候,還是從低地址到高地址的訪問。注意:具體參數(shù)將占用多大的棧區(qū)域空間,將由編譯器決定,因為入棧之前的棧指針和入棧之后的棧指針之間的內容不一定和參數(shù)大小的和一致。
在函數(shù)退出之后,棧指針將返回到函數(shù)進入之前的位置。從上面我們得出,在函數(shù)調用的過程中,每增加一個層次,都會讓程序需要更大的棧空間。
事實上,在函數(shù)的調用過程中,參數(shù)和返回值都將使用棧空間。棧空間的具體規(guī)模是和編譯器有關系的,可以確定的一點是:一般參數(shù)入棧后,前面的參數(shù)將位于內存的低地址,后面的參數(shù)將位于內存的高地址。
在程序中,函數(shù)內部使用的自動變量也是保存在棧區(qū)域的。編譯器在處理自動變量的時候,將在參數(shù)棧區(qū)的后面為自動變量分配棧區(qū)域。棧的開辟順序和參數(shù)的順序是一致的。
編譯器只會為函數(shù)內部的自動變量在棧上開辟空間,如果函數(shù)內部的變量改為靜態(tài)變量,這個時候編譯器就不會為這個變量在棧上開辟空間了,而是將它放入靜態(tài)的存儲區(qū)內。
程序中使用的自動局部變量和參數(shù)的類型都是C語言的基本類型,在32位的系統(tǒng)中,int為32位(4字節(jié)),這種變量類型將占用4個字節(jié)的棧空間。在程序中,可能使用較大的棧空間的變量類型是結構體和數(shù)組。
關于棧空間的使用,完全是由編譯器來處理的,在程序中不需要管理棧。當函數(shù)退出之后,函數(shù)棧上的內容將被釋放,因此,在函數(shù)跳出后,函數(shù)棧上的內容是不能被別的函數(shù)使用的。
內層函數(shù)可以使用外層函數(shù)的棧內存,但是外層函數(shù)不能使用內層函數(shù)的棧內存。
自動變量的地址不可以作為函數(shù)返回值,但是可以作為參數(shù)傳遞給其他函數(shù)。
審核編輯 :李倩
-
函數(shù)
+關注
關注
3文章
4346瀏覽量
62977 -
編譯器
+關注
關注
1文章
1642瀏覽量
49286 -
C程序
+關注
關注
4文章
255瀏覽量
36139
原文標題:C程序中棧空間的使用
文章出處:【微信號:gh_e7f294a514ca,微信公眾號:單片機匠人】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
λ-IO:存儲計算下的IO棧設計
![λ-IO:存儲計算下的IO<b class='flag-5'>棧</b>設計](https://file1.elecfans.com/web3/M00/00/AF/wKgZO2dNHbaAIkp-AAAM3550zYU863.png)
AWTK-WEB 快速入門(1) - C 語言應用程序
![AWTK-WEB 快速入門(1) - <b class='flag-5'>C</b> 語言應用<b class='flag-5'>程序</b>](https://file.elecfans.com/web2/M00/50/DA/pYYBAGLH6TyAB71EAAAPQ7KgtYA038.png)
簡述大前端技術棧的渲染原理
使用OpenVINO GenAI API在C++中構建AI應用程序
![使用OpenVINO GenAI API在<b class='flag-5'>C</b>++<b class='flag-5'>中</b>構建AI應用<b class='flag-5'>程序</b>](https://file1.elecfans.com/web2/M00/09/51/wKgZomcJ0ziAd_APAAATE9KW7lE007.png)
Linux網(wǎng)絡協(xié)議棧的實現(xiàn)
![Linux網(wǎng)絡協(xié)議<b class='flag-5'>棧</b>的實現(xiàn)](https://file1.elecfans.com/web2/M00/06/C6/wKgaombfpT-AeVQcAACjr17dpiQ190.png)
linux驅動程序運行在什么空間
請問FW OTA二進制文件是否包含應用程序和BT棧/程序庫?
STM32啟動文件中棧大小根據(jù)什么設置的呢?
物聯(lián)數(shù)據(jù)棧網(wǎng)關是什么?
調整PWM占空比值時硬件錯誤HardFault_Handler的原因?
C語言內存泄漏問題原理
![<b class='flag-5'>C</b>語言內存泄漏問題原理](https://file1.elecfans.com/web2/M00/C4/F2/wKgZomX5CPGAHxynAAAdVE956KA826.png)
評論