C語言函式引數入棧的順序為什麼是從右到左

2022-05-08 22:00:12 字數 670 閱讀 4537

執行以下**:

void print(int x,int y,int

z)int

main()

輸出:

首先明確乙個事實:在乙個程序的記憶體圖中,棧段位於上部,並且從高位址到低位址擴充套件,不會的可以看這裡:

原因:由於c語言有不定長引數函式,比如下面這個:

int add(int

num,...)

/*清理記憶體

*/va_end(valist);

return

sum;

}int

main()

其執行原理是:num指示引數個數,然後函式體內部的valist是乙個void*指標,每次移sizeof(int)大小,即每次取1個int引數。但我也沒有研究過這個方面,大概知道有這麼個東西就行

總之我想說的是,如果函式呼叫是從左到右入棧引數,像上面的函式引數形成的棧就是這樣的:num,1,2,3。

其中num在棧底,3在棧頂。但是由於這是個不定引數函式,需要這個num的值去確定我們引數的個數,但num在棧底我們抽不出來阿,問題就在這兒。

如果從右到左入棧的話就不存在這個問題了。

參考:

c語言中函式引數入棧的順序是什麼?為什麼

看到面試題 語言中函式引數的入棧順序如何?自己不知道,邊上網找資料。下面是詳細解釋 include void foo int x,int y,int z int main int argc,char ar 執行結果 x 100 at bfe28760 y 200 at bfe28764 z 300 ...

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

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

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

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