淺談C語(yǔ)言中函數(shù)參數(shù)的入棧順序
棧,我想大家都知道。棧,是硬件。主要作用表現(xiàn)為一種數(shù)據(jù)結(jié)構(gòu),是只能在某一端插入和刪除的特殊線性表。下面介紹C語(yǔ)言中函數(shù)參數(shù)的入棧順序是怎樣的。
對(duì)技術(shù)執(zhí)著的人,比如說我,往往對(duì)一些問題,不僅想做到"知其然",還想做到"知其所以然".C語(yǔ)言可謂博大精深,即使我已經(jīng)有多年的開發(fā)經(jīng)驗(yàn),可還是有許多問題不知其所以然。某天某地某人問我,C語(yǔ)言中函數(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語(yǔ)言中參數(shù)就是從左到右入棧的,有些語(yǔ)言中還可以通過修飾符進(jìn)行指定,如Visual C++.即然兩種方式都可以,為什么C語(yǔ)言要選擇從右至左呢?
進(jìn)一步發(fā)現(xiàn),Pascal語(yǔ)言不支持可變長(zhǎng)參數(shù),而C語(yǔ)言支持這種特色,正是這個(gè)原因使得C語(yǔ)言函數(shù)參數(shù)入棧順序?yàn)閺挠抑磷?。具體原因?yàn)椋篊方式參數(shù)入棧順序(從右至左)的好處就是可以動(dòng)態(tài)變化參數(shù)個(gè)數(shù)。通過棧堆分析可知,自左向右的入棧方式,最前面的參數(shù)被壓在棧底。除非知道參數(shù)個(gè)數(shù),否則是無(wú)法通過棧指針的相對(duì)位移求得最左邊的參數(shù)。這樣就變成了左邊參數(shù)的個(gè)數(shù)不確定,正好和動(dòng)態(tài)參數(shù)個(gè)數(shù)的方向相反。
因此,C語(yǔ)言函數(shù)參數(shù)采用自右向左的入棧順序,主要原因是為了支持可變長(zhǎng)參數(shù)形式。換句話說,如果不支持這個(gè)特色,C語(yǔ)言完全和Pascal一樣,采用自左向右的參數(shù)入棧方式。
【編輯推薦】
- C語(yǔ)言的面向?qū)ο笫街貥?gòu)
- C語(yǔ)言中可變參數(shù)的使用
- 用C語(yǔ)言的rand()和srand()產(chǎn)生偽隨機(jī)數(shù)的方法總結(jié)
- C語(yǔ)言編程開發(fā)中用好位操作符
- 講述C語(yǔ)言編寫Windows服務(wù)程序