C語言中函數(shù)參數(shù)的入棧順序詳解及實(shí)例
C語言中函數(shù)參數(shù)的入棧順序詳解及實(shí)例
對技術(shù)執(zhí)著的人,比如說我,往往對一些問題,不僅想做到“知其然”,還想做到“知其所以然”。C語言可謂博大精深,即使我已經(jīng)有多年的開發(fā)經(jīng)驗(yàn),可還是有許多問題不知其所以然。某天某地某人問我,C語言中函數(shù)參數(shù)的入棧順序如何?從右至左,我隨口回答。為什么是從右至左呢?我終究沒有給出合理的解釋。于是,只好做了個(gè)作業(yè),于是有了這篇小博文。
#include void foo(int x, int y, int z) { printf("x = %d at [%X]n", x, &x); printf("y = %d at [%X]n", y, &y); printf("z = %d at [%X]n", z, &z); } int main(int argc, char *argv[]) { foo(100, 200, 300); return 0; }
運(yùn)行結(jié)果:
x = 100 at [BFE28760] y = 200 at [BFE28764] z = 300 at [BFE28768]
C程序棧底為高地址,棧頂為低地址,因此上面的實(shí)例可以說明函數(shù)參數(shù)入棧順序的確是從右至左的。可到底為什么呢?查了一直些文獻(xiàn)得知,參數(shù)入棧順序是和具體編譯器實(shí)現(xiàn)相關(guān)的。比如,Pascal語言中參數(shù)就是從左到右入棧的,有些語言中還可以通過修飾符進(jìn)行指定,如VisualC++。即然兩種方式都可以,為什么C語言要選擇從右至左呢?
進(jìn)一步發(fā)現(xiàn),Pascal語言不支持可變長參數(shù),而C語言支持這種特色,正是這個(gè)原因使得C語言函數(shù)參數(shù)入棧順序?yàn)閺挠抑磷蟆>唧w原因?yàn)椋篊方式參數(shù)入棧順序(從右至左)的好處就是可以動態(tài)變化參數(shù)個(gè)數(shù)。通過棧堆分析可知,自左向右的入棧方式,最前面的參數(shù)被壓在棧底。除非知道參數(shù)個(gè)數(shù),否則是無法通過棧指針的相對位移求得最左邊的參數(shù)。這樣就變成了左邊參數(shù)的個(gè)數(shù)不確定,正好和動態(tài)參數(shù)個(gè)數(shù)的方向相反。
因此,C語言函數(shù)參數(shù)采用自右向左的入棧順序,主要原因是為了支持可變長參數(shù)形式。換句話說,如果不支持這個(gè)特色,C語言完全和Pascal一樣,采用自左向右的參數(shù)入棧方式
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
C++中string與int的相互轉(zhuǎn)換實(shí)現(xiàn)代碼
這篇文章主要介紹了C++中string與int的相互轉(zhuǎn)換實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-05-05C++11 call_once 和 once_flag的使用與區(qū)別
本文主要介紹了C++11 call_once 和 once_flag的使用與區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06C++實(shí)現(xiàn)LeetCode(136.單獨(dú)的數(shù)字)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(136.單獨(dú)的數(shù)字),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++執(zhí)行shell命令的多種實(shí)現(xiàn)方法
在linux系統(tǒng)下,用C++程序執(zhí)行shell命令有多種方式,主要介紹了3中方法,具有一定的參考價(jià)值,感興趣的可以了解一下2021-11-11OpenCV使用稀疏光流實(shí)現(xiàn)視頻對象跟蹤的方法詳解
這篇文章主要為大家詳細(xì)介紹了OpenCV如何使用稀疏光流實(shí)現(xiàn)視頻對象跟蹤功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-02-02C語言大作業(yè)之圖書管理系統(tǒng)的實(shí)現(xiàn)詳程
隨著網(wǎng)絡(luò)技術(shù)的高速發(fā)展,計(jì)算機(jī)應(yīng)用的普及,利用計(jì)算機(jī)對圖書館的日常工作進(jìn)行管理勢在必行,趁著寒假時(shí)間手把手帶你用C語言實(shí)現(xiàn)一個(gè)圖書管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2022-01-01C語言三個(gè)函數(shù)的模擬實(shí)現(xiàn)詳解
這篇文章主要為大家詳細(xì)介紹了C語言三個(gè)函數(shù)的模擬實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03