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