C語言中函式引數的入棧順序詳解及例項

2022-10-04 01:24:11 字數 921 閱讀 4479

c語言中函式引數的入棧順序詳解及例項

對技術執著的人,比如說我,往往對一些問題,不僅想做到「知其然」,還想做到「知其所以然」。c語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,c語言中函式引數的入棧順序如何?從右至左,我隨口回答。為什麼是從右至左呢?我終究沒有給出合理的解釋。於是,只好做了個作業,於是有了這篇小博文。

#include

void foo(int x, int y, int z)

int main(int argc, char *ar**)

&nbs程式設計客棧p;執行結果:

x = 100 at [bfe28760]

y = 200 at [bfe28764]

z = 300 at [bfe28768]

c程式棧底為高位址,棧頂為低位址,因此上面的例項可以說明函式引數入棧順序的確是從右至左的。可到底為什麼呢?查了一直些文獻得知,引數入棧順序是和具體編譯器實現相關的。比如,pascal語言中引數就是從左到右入棧的,有些語言中還可以通過修飾符進行指定,如visualc++。即然兩種方式都可以,為什麼costxzidi語言要選擇從右至左呢?

進一步發現,pascal語言不支援可變長引數,而c語言支援這種特色,正是這個原因使得c語言函式引數入棧順序為從右至左。具體原因為:c方式引數入棧順序(從右至左)的好處就程式設計客棧是可以動態變化引數個數。通過棧堆分析可知,自左向右的入棧方式,最前面的引數被壓在棧底。除非知道引數個數,否則是無法通過棧指標的相對位移求得最左邊的引數。這樣就變成了左邊引數的個數程式設計客棧不確定,正好和動態引數個數的方向相反。

因此,c語言函式引數採用自右向左的入棧順序,主要原因是為了支援可變長引數形式。換程式設計客棧句話說,如果不支援這個特色,c語言完全和pascal一樣,採用自左向右的引數入棧方式

本文標題: c語言中函式引數的入棧順序詳解及例項

本文位址:

語言中函式引數的入棧順序

對技術執著的人,比如說我,往往對一些問題,不僅想做到 知其然 還想做到 知其所以然 語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,語言中函式引數的入棧順序如何?從右至左,我隨口回答。為什麼是從右至左呢?我終究沒有給出合理的解釋。於是,只好做了個作業,於...

語言中函式引數的入棧順序

對技術執著的人,比如說我,往往對一些問題,不僅想做到 知其然 還想做到 知其所以然 語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,語言中函式引數的入棧順序如何?從右至左,我隨口回答。為什麼是從右至左呢?我終究沒有給出合理的解釋。於是,只好做了個作業,於...

語言中函式引數的入棧順序

分類 linux程式設計 2011 03 08 10 06 79人閱讀收藏 舉報 對技術執著的人,比如說我,往往對一些問題,不僅想做到 知其然 還想做到 知其所以然 語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,語言中函式引數的入棧順序如何?從右至左,...