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