執行以下**:
void print(int x,int y,int輸出:z)int
main()
![](https://pic.w3help.cc/277/f8ab1e068a629e404c47563b454d2.jpeg)
首先明確乙個事實:在乙個程序的記憶體圖中,棧段位於上部,並且從高位址到低位址擴充套件,不會的可以看這裡:
原因:由於c語言有不定長引數函式,比如下面這個:
int add(int其執行原理是:num指示引數個數,然後函式體內部的valist是乙個void*指標,每次移sizeof(int)大小,即每次取1個int引數。但我也沒有研究過這個方面,大概知道有這麼個東西就行num,...)
/*清理記憶體
*/va_end(valist);
return
sum;
}int
main()
總之我想說的是,如果函式呼叫是從左到右入棧引數,像上面的函式引數形成的棧就是這樣的: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 ...
語言中函式引數的入棧順序
對技術執著的人,比如說我,往往對一些問題,不僅想做到 知其然 還想做到 知其所以然 語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,語言中函式引數的入棧順序如何?從右至左,我隨口回答。為什麼是從右至左呢?我終究沒有給出合理的解釋。於是,只好做了個作業,於...
語言中函式引數的入棧順序
對技術執著的人,比如說我,往往對一些問題,不僅想做到 知其然 還想做到 知其所以然 語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,語言中函式引數的入棧順序如何?從右至左,我隨口回答。為什麼是從右至左呢?我終究沒有給出合理的解釋。於是,只好做了個作業,於...