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

简介:  2)接下来,我们将讨论第二个问题,那就是函数返回值与参数在栈上存放顺序。 我们设计如下程序: #include "iostream" using namespace std; int test(int a, int b){ int c; printf("%p\n",&b); //最...

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

img_05c595844cf1f247fab3c2a443a31f9e.png

VS下执行结果如下所示:

img_fa45ce1c485f787e07e0f448a46acd42.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.csdn.net/t/20060901/14/4991970.html

目录
相关文章
|
15天前
|
消息中间件 存储 搜索推荐
深入理解栈和队列(二):队列
深入理解栈和队列(二):队列
29 0
|
7天前
|
Python
python学习-函数模块,数据结构,字符串和列表(下)
python学习-函数模块,数据结构,字符串和列表
44 0
|
8天前
|
存储 算法 调度
数据结构期末复习(3)栈和队列
数据结构期末复习(3)栈和队列
16 0
|
20天前
|
存储 缓存 算法
【算法与数据结构】栈的实现详解
【算法与数据结构】栈的实现详解
|
20天前
|
存储 算法 编译器
【数据结构】栈算法(算法原理+源码)
【数据结构】栈算法(算法原理+源码)
【数据结构】栈算法(算法原理+源码)
|
24天前
|
存储
【数据结构】什么是栈?
【数据结构】什么是栈?
26 0
【数据结构】什么是栈?
|
24天前
|
存储 C语言
【数据结构】线性表的链式存储结构
【数据结构】线性表的链式存储结构
18 0
|
24天前
|
存储 vr&ar
数据结构的图存储结构
数据结构的图存储结构
25 0
|
1月前
【栈】数据结构栈的实现
【栈】数据结构栈的实现
|
1月前
|
存储
数据结构--栈和队列
数据结构--栈和队列

热门文章

最新文章