免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 C/C++ C堆栈
1234下一页
最近访问板块 发新帖
查看: 6809 | 回复: 37
打印 上一主题 下一主题

C堆栈 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-29 15:04 |只看该作者 |倒序浏览
#include <stdio.h>


int* f(int n){
    int result=n+1;
    return &result;
    }
int main()
{
    int *n1=f(1);
    int *n2=f(2);
    printf("*n1's value is: %d\naddress is: 0x%x\n", *n1, n1);
    printf("*n2's value is: %d\naddress is: 0x%x\n", *n2, n2);
    return 0;
}
--------------------------------------------------------------------------------------------
*n1's value is: 3
address is: 0x22ff44
*n2's value is: -1
address is: 0x22ff44
---------------------------------------------------------------------------------------------
看上面的结果,*n1的值肯定为3,但是为什么*n2的值为-1,这块想不通,因为n1和n2指向的地址都是一样的啊。

[ 本帖最后由 mailisall 于 2008-7-29 15:19 编辑 ]

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
2 [报告]
发表于 2008-07-29 15:16 |只看该作者
没有搞懂LZ为什么这样写

而且int * f(n){...}函数参数无类型!

论坛徽章:
0
3 [报告]
发表于 2008-07-29 15:18 |只看该作者
你把两个printf的调用顺序换一个位置,
于是你就明白为什么了.

论坛徽章:
0
4 [报告]
发表于 2008-07-29 15:24 |只看该作者
原帖由 gtkmm 于 2008-7-29 15:18 发表
你把两个printf的调用顺序换一个位置,
于是你就明白为什么了.

大侠能给解释一下为什么吗,确实如你所说,但是不知道为什么。

论坛徽章:
0
5 [报告]
发表于 2008-07-29 15:32 |只看该作者
result是一个局部变量,在函数f调用完成后,这个局部变量,和地址,都是不应该使用的.

不过,函数f刚刚调用完成后,这个局部变量的值,还没有被重写.
( 也就是这一瞬间,这个值还能用.  )

第一个printf的参数*n1,是在printf调用前求值的,也就是被重写前,于是可以得到3.

之后,第一个printf函数开始执行,这个函数会占用那个result的地址,也就是把值给改成了-1.
( 至于为什么改成-1,而不是别的,这是没有规律的.)

因此,第二个printf得到了-1的值.
( 如果我没有猜错的话,以后再用同样的方式调用printf,得到的值也是-1)

论坛徽章:
0
6 [报告]
发表于 2008-07-29 15:51 |只看该作者
原帖由 gtkmm 于 2008-7-29 15:32 发表
result是一个局部变量,在函数f调用完成后,这个局部变量,和地址,都是不应该使用的.

不过,函数f刚刚调用完成后,这个局部变量的值,还没有被重写.
( 也就是这一瞬间,这个值还能用.  )

第一个printf的参数*n1 ...

真是高手。居然知道printf会覆盖那块内存。佩服。

论坛徽章:
0
7 [报告]
发表于 2008-07-29 16:14 |只看该作者
我觉得和堆栈的使用方式有关系。打时间差是不可能的。

[ 本帖最后由 mailisall 于 2008-7-29 16:19 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-07-29 16:20 |只看该作者
学习了,果然是覆盖了,不一定是-1,随机的啦。

论坛徽章:
0
9 [报告]
发表于 2008-07-29 23:22 |只看该作者
这个题蛮经典,GTKMM讲的很好,受教了
但LS说的是个随机数,也不是很随机吧...
起码以后每次运行得到的值应该都是一样的,如果第一次是-1,以后运行应该都是-1(支持gtkmm的说法)
因为是同一个程序覆盖的同一段起始内存,所以前后取的值应该也相同

论坛徽章:
52
码神
日期:2017-03-28 10:27:10综合交流区版块每日发帖之星
日期:2015-10-11 06:20:00综合交流区版块每日发帖之星
日期:2015-09-28 06:20:00综合交流区版块每日发帖之星
日期:2015-09-22 06:20:00每日论坛发贴之星
日期:2015-09-12 06:20:00综合交流区版块每日发帖之星
日期:2015-09-12 06:20:00综合交流区版块每日发帖之星
日期:2015-09-08 06:20:00综合交流区版块每日发帖之星
日期:2015-09-05 06:20:00综合交流区版块每日发帖之星
日期:2015-09-04 06:20:002015亚冠之德黑兰石油
日期:2015-09-01 10:41:53每日论坛发贴之星
日期:2015-10-11 06:20:00综合交流区版块每日发帖之星
日期:2015-10-12 06:20:00
10 [报告]
发表于 2008-07-29 23:27 |只看该作者

回复 #1 mailisall 的帖子

学习。。。

评分

参与人数 2可用积分 +20 收起 理由
shishui0147 + 10
ld19820410 + 10

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP