免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ytl
打印 上一主题 下一主题

全局变量的地址为什么会改变? [复制链接]

论坛徽章:
0
91 [报告]
发表于 2010-01-26 15:31 |只看该作者
楼上是谁家的宠物跑出来了?

论坛徽章:
0
92 [报告]
发表于 2010-01-26 15:32 |只看该作者
原帖由 yuanbao2004 于 2010-1-26 11:58 发表
AIX 4.1系统。程序是单线程的,大致如下

int global_int = 0;      
for (int i = 0; ; i++)      {
      printf("addr = %p, value = %d\n", &global_int, global_int);
      global_int++;          ...


见88楼的解说

论坛徽章:
0
93 [报告]
发表于 2010-01-26 18:06 |只看该作者
学习一下!

论坛徽章:
0
94 [报告]
发表于 2010-01-26 18:36 |只看该作者
调用printf的时候,global_int的地址是作为参数压入栈中的,循环导致溢出把栈上这个位置覆盖了,不是全局变量的地址变了。这么个简单问题连编译器bug都整出来了,去查一下函数调用时栈帧是怎么变化的不就清楚了。

论坛徽章:
0
95 [报告]
发表于 2010-01-27 12:34 |只看该作者
楼上的,你说这些没用。楼主可是认为全局数据是在代码段,read-only的。你觉得lz懂你说的啥吗。

论坛徽章:
0
96 [报告]
发表于 2010-01-27 14:42 |只看该作者
是的,楼上的,楼主明显新手,,基本概念都没搞清楚,,扯啥编译器bug,,

论坛徽章:
0
97 [报告]
发表于 2010-01-27 15:00 |只看该作者
原帖由 caravsapm70 于 2010-1-27 12:34 发表
楼上的,你说这些没用。楼主可是认为全局数据是在代码段,read-only的。你觉得lz懂你说的啥吗。


第一个说这话的人,我让他自掌嘴巴20次;对于你,找块豆腐撞死算了...
搞不清楚变量与变量地址的区别不是你的错,出来丢人现眼就是你的不对了!

论坛徽章:
0
98 [报告]
发表于 2010-01-27 15:05 |只看该作者
原帖由 奶茶dsk 于 2010-1-27 14:42 发表
是的,楼上的,楼主明显新手,,基本概念都没搞清楚,,扯啥编译器bug,,


马甲出来骂人了?
谁扯编译器bug?我是一直坚持不要往编译器bug上头想,倒是某些人偏往编译器上扯,又是优化,又是......最后反而倒打一耙,真是小丑!

论坛徽章:
0
99 [报告]
发表于 2010-01-27 15:22 |只看该作者

回复 #97 奶茶dsk 和 #96 caravsapm70 的帖子

上面回复了你们后感到恶心!其实你们用的就是街头混混吵架的伎俩: 声大,重复,颠倒黑白!
令人痛心的是,如今这种混混也冒充C程序员了。。。。。。

论坛徽章:
0
100 [报告]
发表于 2010-01-27 15:24 |只看该作者
原帖由 ytl 于 2010-1-27 15:00 发表


第一个说这话的人,我让他自掌嘴巴20次;对于你,找块豆腐撞死算了...
搞不清楚变量与变量地址的区别不是你的错,出来丢人现眼就是你的不对了!

你真没救了。调用printf("addr = %p, value = %d\n", &global_int, global_int)的时候,栈底是返回地址,bp+4 放的是global_int的值,bp+8放的是global_int的地址,global_int值溢出覆盖了bp+8处的内容。你这水平也敢写C,胆儿够大的。

[ 本帖最后由 shanwx 于 2010-1-27 15:26 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP