免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
61 [报告]
发表于 2010-01-25 11:09 |只看该作者
原帖由 writer15 于 2010-1-25 10:25 发表
标题是  变量的地址为什么会改变呢?
内容说的却是 全局变量。
可见楼主表达能力不行,或者说逻辑不严谨。。。。

还有楼主对你指出错误,你却别人自掌嘴巴? 什么态度。。。
全局变量的地址是固定的,但可 ...


你也该自掌嘴巴!全局变量难道不是变量? 要是能在标题里说清楚还要内容干嘛?

[ 本帖最后由 ytl 于 2010-1-25 11:20 编辑 ]

论坛徽章:
0
62 [报告]
发表于 2010-01-25 11:11 |只看该作者
原帖由 versaariel 于 2010-1-25 10:23 发表
LZ的意思是
int g_test = 0;
while(1)
{
    printf("%d",&g_test);
}
每次输出不一样?


某次输出不一样,比如第100万次

论坛徽章:
0
63 [报告]
发表于 2010-01-25 11:15 |只看该作者
原帖由 hb12112 于 2010-1-25 10:14 发表



全局变量啥时放到代码段了?还是先把基本功练扎实吧。

错就错了,别人给你指出问题还这么牛就不对了。


你什么意思! 我说说自己的理解,怎么就牛了? 莫名其妙!
还有,您老人家视力有问题吧, “全局变量的地址”怎么能看成“全局变量”?一开始有人搞错还情有可原,讨论这么久了还犯这么低级的错误?

[ 本帖最后由 ytl 于 2010-1-25 11:18 编辑 ]

论坛徽章:
0
64 [报告]
发表于 2010-01-25 11:21 |只看该作者
别吵了,大家都是来学习的,呵呵

论坛徽章:
0
65 [报告]
发表于 2010-01-25 11:27 |只看该作者
贴出全部代码是不现实的,因为代码有几十万行,而且没有哪一块看起来跟这个问题本身有紧密地关系
这里只是想请高手说说有哪些机制可能导致全局变量的地址改变,比如地址越界?还是堆栈溢出?而不是找出代码的具体问题

论坛徽章:
0
66 [报告]
发表于 2010-01-25 11:34 |只看该作者
几点说明:
1. 应该不是printf参数的问题,因为接下来程序就core掉了,证明变量的内容变了,看起来应该是地址变化引起的
2. 但是dbx中看到的地址和内容都是正确的
3. 不排除内存访问越界导致的,如果是这种情况,请高手说说访问越界如何改变全局变量的地址?如果不是,可能的原因还有那些?
4. 地址改变可能只是个假象,可能是某些数据被破坏导致的。那么哪些数据结构(包括寄存器等)会影响全局变量的地址呢?
5. 亦或是地址根本没有改变,而是读写溢出导致printf参数没有正确传递?那么接下来的coredump还是无法解释!

[ 本帖最后由 ytl 于 2010-1-25 11:55 编辑 ]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
67 [报告]
发表于 2010-01-25 13:19 |只看该作者
全局变量不一定在数据段的,当然绝大多数情况下全局变量时在数据段的。

binutils中的ld支持链接脚本,通过自己写链接脚本就可以把全局变量放到代码段里面去。如果最终可执行程序是elf格式的,你甚至可以自己创立一个段,名字叫个global段啥的,专门用来放全局变量。

在多数linux下面,find /usr -type d -name ldscripts可以找到一个专门用来保存ld脚本的文件夹

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
68 [报告]
发表于 2010-01-25 13:29 |只看该作者

回复 #66 ytl 的帖子

1. 全局变量的地址是不可能改变的。它的地址在链接或者装载的时候就已经确定了,也就是说你传给printf的参数实际上是个常量。跟printf("%p", 0x1234)这种差不多。
2. 你这个肯定是溢出或者野指针造成的。
3. 去搜一下你用的aix版本的函数调用的abi,看看printf的几个参数到底是怎么传的。然后在保存参数的那个内存地址设一个watch point,再gdb。程序溢出的时候你就可以看到到底是哪个地方溢出了。
4. 可以试一下purify

============================

ps,我不知道aix下面有没有gdb

[ 本帖最后由 koolcoy 于 2010-1-25 13:31 编辑 ]

论坛徽章:
0
69 [报告]
发表于 2010-01-25 13:33 |只看该作者

回复 #68 koolcoy 的帖子

你给Y讲这些,凭他的智商是根本理解不了的,Y就认为Y的代码没问题,还硬扯上编译器,我都猜到是什么问题了。等Y自己醒悟吧,又不是我们自己的工作内容。

论坛徽章:
0
70 [报告]
发表于 2010-01-25 13:38 |只看该作者
原帖由 prolj 于 2010-1-25 13:33 发表
你给Y讲这些,凭他的智商是根本理解不了的,Y就认为Y的代码没问题,还硬扯上编译器,我都猜到是什么问题了。等Y自己醒悟吧,又不是我们自己的工作内容。


你猜到了什么了?猜到我们在说什么了吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP