4、对变量在栈上存储顺序,及函数返回值与参数在栈上存放顺序的思考(2)

本文探讨了函数参数及返回值在栈上的存放顺序,通过具体代码示例验证了参数入栈顺序,并对函数返回地址的理解进行了讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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上结果如下所示:

2010080321335337.png

VS下执行结果如下所示:

2010080321342759.png

    由上可以,确实最后一个参数是先入栈的。至于c的地址就是函数的返回地址,我是参考文章[1],网友jixingzhong如此说。我们在汇编语言中学过,函数的返回地址是将要执行的下一条指令的地址;这里的意思是,把调用函数的指令的下一条指令入栈,以便调用完函数后返回,而我觉得参考文章中jixingzhong理解错这句了,所以我认为是错的。

在本程序中,test函数的返回地址应当是

int t = f(a, b);

cout << &a <<endl

的汇编指令后,在执行完函数后下一条将要执行的指令的地址。

网友Arthur_认为,通过如下程序可以求得这个地址:

#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 ((int*)&b-1);

}

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",t);

}

    而很明显的,这个结果是a的地址。所以,我认为,网友Arthur的想法也是不正确的(欢迎争鸣)。而正确的结论就当是本文中,我用红色标明的地方。

    当然,我希望了解这方面知识的高手们一起来讨论一下这个问题。

参考:

[1] http://topic.youkuaiyun.com/t/20060901/14/4991970.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值