一段如下代碼:
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
,通過查看內存變量,發現事實就是如此。