天天看點

4、對變量在棧上存儲順序,及函數傳回值與參數在棧上存放順序的思考(2)

 2)接下來,我們将讨論第二個問題,那就是函數傳回值與參數在棧上存放順序。

我們設計如下程式:

#include "iostream"

using namespace std;

int test(int a, int b){

int c;

printf("%p\n",&b); //最後一個參數

printf("%p\n",&a); //第一個參數

printf("%p\n",&c); //函數的傳回值位址

return c;

}

int main()

{

int a = 1;

int b = 2;

int (*f)(int, int);

f = test;

int t = f(a, b);

cout << &a <<endl

     << &b <<endl;

printf("%p\n",test);

在GCC上結果如下所示:

4、對變量在棧上存儲順序,及函數傳回值與參數在棧上存放順序的思考(2)

在VS下執行結果如下所示:

4、對變量在棧上存儲順序,及函數傳回值與參數在棧上存放順序的思考(2)

    由上可以,确實最後一個參數是先入棧的。至于c的位址就是函數的傳回位址,我是參考文章[1],網友jixingzhong如此說。我們在彙編語言中學過,函數的傳回位址是将要執行的下一條指令的位址;這裡的意思是,把調用函數的指令的下一條指令入棧,以便調用完函數後傳回,而我覺得參考文章中jixingzhong了解錯這句了,是以我認為是錯的。

在本程式中,test函數的傳回位址應當是

的彙編指令後,在執行完函數後下一條将要執行的指令的位址。

網友Arthur_認為,通過如下程式可以求得這個位址:

int* test(int a, int b){

return ((int*)&b-1);

int* (*f)(int, int);

int *t = f(a, b);

printf("%p\n",t);

    而很明顯的,這個結果是a的位址。是以,我認為,網友Arthur的想法也是不正确的(歡迎争鳴)。而正确的結論就當是本文中,我用紅色标明的地方。

    當然,我希望了解這方面知識的高手們一起來讨論一下這個問題。

參考:

[1] http://topic.csdn.net/t/20060901/14/4991970.html