函數參數壓棧順序

一段如下代碼:

void func(int k,char * sz,int b)
{
 return;
}

void main(void)
{
    int i = 0x22222222;
    char szTest[] = "abcd";
    int fb = 0x11111111;
    func(i,szTest,fb);
}

問:參數在棧中的先後順序是怎麼樣的呢?

 

對於這個問題,我們要知道兩點:第一,參數壓棧的順序是從右到左,對應到上面的代碼也就是先壓b,然後是sz,最後是k。 第二,棧空間是從高地址向低地址發展的。

所以,我們可以估計出他們在內存中的分佈,從高地址到低地址的順序是:b, sz,k。 同時由於三個參數都佔4個字節大小,所以兩個參數的首地址之間相隔四個字節。

運行上述程序,動態觀察三個變量的內存分佈如下:

變量b在內存中的地址爲:&b = 0x0025fa90

變量sz在內存中的地址爲:&sz = 0x0025fa8c

變量k在內存中的地址爲:&k = 0x0025fa88

上述地址印證了我們的說法。

 

另外,棧中的sz存儲的是什麼呢? 對了,就是主函數中的char 數組的首地址。觀察內存,我們看到szTest的首地址爲:0x0025fb40, 所以,sz的值就應該是0x0025fb40

,通過查看內存變量,發現事實就是如此。

發佈了44 篇原創文章 · 獲贊 10 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章