對技術執著的人,比如說我,往往對一些問題,不僅想做到「知其然」,還想做到「知其所以然」。c語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,c語言中函式引數的入棧順序如何?從右至左,我隨口回答。為什麼是從右至左呢?我終究沒有給出合理的解釋。於是,只好做了個作業,於是有了這篇小博文。
#include
void foo(int x, int y, int z)
int main(int argc, char *argv)
執行結果:
x = 100 at [bfe28760]
y = 200 at [bfe28764]
z = 300 at [bfe28768]
c程式棧底為高位址,棧頂為低位址,因此上面的例項可以說明函式引數入棧順序的確是從右至左的。可到底為什麼呢?查了一直些文獻得知,引數入棧順序是和具體編譯器實現相關的。比如,pascal語言中引數就是從左到右入棧的,有些語言中還可以通過修飾符進行指定,如visual c++。即然兩種方式都可以,為什麼c語言要選擇從右至左呢?
進一步發現,pascal語言不支援可變長引數,而c語言支援這種特色,正是這個原因使得c語言函式引數入棧順序為從右至左。具體原因為:c方式引數入棧順序(從右至左)的好處就是可以動態變化引數個數。通過棧堆分析可知,自左向右的入棧方式,最前面的引數被壓在棧底。除非知道引數個數,否則是無法通過棧指標的相對位移求得最左邊的引數。這樣就變成了左邊引數的個數不確定,正好和動態引數個數的方向相反。
因此,c語言函式引數採用自右向左的入棧順序,主要原因是為了支援可變長引數形式,c語言中可變引數都是從左到右,所以不管你有多少個引數反正將最右面的那個壓入棧底,最左面的引數出入棧頂。換句話說,如果不支援這個特色,c語言完全和pascal一樣,採用自左向右的引數入棧方式。
語言中函式引數的入棧順序
對技術執著的人,比如說我,往往對一些問題,不僅想做到 知其然 還想做到 知其所以然 語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,語言中函式引數的入棧順序如何?從右至左,我隨口回答。為什麼是從右至左呢?我終究沒有給出合理的解釋。於是,只好做了個作業,於...
語言中函式引數的入棧順序
分類 linux程式設計 2011 03 08 10 06 79人閱讀收藏 舉報 對技術執著的人,比如說我,往往對一些問題,不僅想做到 知其然 還想做到 知其所以然 語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,語言中函式引數的入棧順序如何?從右至左,...
語言中函式引數的入棧順序
對技術執著的人,比如說我,往往對一些問題,不僅想做到 知其然 還想做到 知其所以然 語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,語言中函式引數的入棧順序如何?從右至左,我隨口回答。為什麼是從右至左呢?我終究沒有給出合理的解釋。於是,只好做了個作業,於...