原帖由 drowndog 于 2010-1-23 15:50 发表
LZ多提供点信息吧。
程序是多线程的还是单线程的?32位的还是64位的?操作系统?
打印出来的地址总共有几种?各是什么值?
是在程序的同一处答应的吗?
这个现象是在程序启动时出现的(然后导致启动失败)? ...
原帖由 starwing83 于 2010-1-24 05:14 发表
你检查一下编译的汇编文件吧。理论上说,静态变量的地址是直接硬编码进code的,实在不行也是一个lea指令,你检查一下到底是怎么回事。
原帖由 starwing83 于 2010-1-24 12:38 发表
那一定是在传进参数以后,和printf实际做write(stdout, text)之前的事情了。可是这整个过程应该是由库函数来管,不可能溢出的吧?(除非printf地址以后又printf一个不对齐的数字,导致覆盖,可是这样是在传进去 ...
原帖由 群雄逐鹿中原 于 2010-1-24 12:38 发表
显然很可能溢出导致函数的返回地址错位, 然后 for循环变量++ 使用到 &global_int 的地址.
需要注意 printf 前后的函数调用情况.
原帖由 stephen_du 于 2010-1-24 19:23 发表
你把那个全局变量volatile掉再试试。
你的for循环疯狂去访问那个变量以及它的地址编译器会做优化
也就是说并不是每次都从原来位置读,自然出问题。
原帖由 群雄逐鹿中原 于 2010-1-24 20:17 发表
这个问题不跟你争论, 不要忘了是 &global_int 突变, 而不是 global_int 不对.
贴完整的代码吧, 这里很多人10分钟之内能看出这个问题.
原帖由 ytl 于 2010-1-24 18:28 发表
AIX 4.1系统。程序是单线程的,大致如下
int global_int = 0;
for (int i = 0; ; i++)
{
printf("addr = %p, value = %d\n", &global_int, global_int);
global_int++;
int_a ...
原帖由 writer15 于 2010-1-25 10:25 发表
标题是 变量的地址为什么会改变呢?
内容说的却是 全局变量。
可见楼主表达能力不行,或者说逻辑不严谨。。。。
还有楼主对你指出错误,你却别人自掌嘴巴? 什么态度。。。
全局变量的地址是固定的,但可 ...
原帖由 versaariel 于 2010-1-25 10:23 发表
LZ的意思是
int g_test = 0;
while(1)
{
printf("%d",&g_test);
}
每次输出不一样?
原帖由 prolj 于 2010-1-25 13:33 发表
你给Y讲这些,凭他的智商是根本理解不了的,Y就认为Y的代码没问题,还硬扯上编译器,我都猜到是什么问题了。等Y自己醒悟吧,又不是我们自己的工作内容。
原帖由 koolcoy 于 2010-1-25 13:29 发表
1. 全局变量的地址是不可能改变的。它的地址在链接或者装载的时候就已经确定了,也就是说你传给printf的参数实际上是个常量。跟printf("%p", 0x1234)这种差不多。
2. 你这个肯定是溢出或者野指针造成的。:mrgr ...
原帖由 koolcoy 于 2010-1-25 14:47 发表
建议某些人找本书看看一个C程序从代码到执行的各个步骤,最少熟悉这几步:编译,链接,装载,运行。在这几步中,编译器,连接器,装载器,内存,CPU,都在干啥。 u ...
原帖由 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++; ...
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |