关于自动变量的一点疑问

lzsdc 2010-10-13 04:35:28
有一个程序是这样的

#include<stdio.h>

int main()
{
int n;
n = 0;

printf("%x:%d\n",n,&n);

return 0;
}

这个代码在win xp 下用gcc 和vc6.0编译后,每次打印的地址是一样的。而在Linux kernal 2.6+gcc/icc编译,每次打印的地址是不一样的,而有人跟我说在win7 中情况如同Linux一样。向大牛求解?
我的想法:
1、&取地址符在Linux中取的是物理地址而非虚拟地址(这个不太可能)
2、系统堆栈从虚拟地址的最高处开始生长。main作为第一个被调用的函数,栈的地址应该是固定的。但这解释不通Linux中的现象
大牛们来讨论一下啊
...全文
94 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
千杯不醉-sen 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lzsdc 的回复:]
引用 7 楼 yangsen600 的回复:

没必要研究这样的问题、、、

我只是蛋疼
[/Quote]
可以理解、、、
lzsdc 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yangsen600 的回复:]

没必要研究这样的问题、、、
[/Quote]
我只是蛋疼
千杯不醉-sen 2010-10-13
  • 打赏
  • 举报
回复
没必要研究这样的问题、、、
东大坡居士 2010-10-13
  • 打赏
  • 举报
回复
&取的应该都是虚拟地址吧~~~
lzsdc 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wissup 的回复:]

这个应该跟操作系统如何管理虚拟内存,以及编译器和操作系统之间的关联有关系。
[/Quote]
取地址符取得是虚拟地址,应该跟虚拟内存管理没什么关系。而且为什么微软自己的操作系统会有两个处理方式
wissup 2010-10-13
  • 打赏
  • 举报
回复
这个应该跟操作系统如何管理虚拟内存,以及编译器和操作系统之间的关联有关系。
lzsdc 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 petewong 的回复:]

被编译器优化了
你来在打开一些其它程序 ,或重起一下机
多编译运行几次 应该有不一样的时候
[/Quote]
同学测试过了,xp中重启,开很多很多程序,地址都不会变。
而且为什么这种优化在win7中取消了?
冻结 2010-10-13
  • 打赏
  • 举报
回复
感觉研究这个有点浪费时间。
petewong 2010-10-13
  • 打赏
  • 举报
回复
被编译器优化了
你来在打开一些其它程序 ,或重起一下机
多编译运行几次 应该有不一样的时候

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧