全局变量和局部变量的存储地址问题。

Chivalry 2007-04-16 09:22:48
int dog, cat, bird, fish;

int main() {
int i, j, k;
cout << "dog: " << (long)&dog << endl;
cout << "cat: " << (long)&cat << endl;
cout << "bird: " << (long)&bird << endl;
cout << "fish: " << (long)&fish << endl;
cout << "i: " << (long)&i << endl;
cout << "j: " << (long)&j << endl;
cout << "k: " << (long)&k << endl;
} ///:~

dog: 4323632
cat: 4323636
bird: 4323640
fish: 4323644

i: 6684160
j: 6684156
k: 6684152
这是C++编程思想的一道题目
它的全局变量的存储地址按照声明的顺序增加,局部变量按照声明的顺序递减
我的理解是全局变量存放在全局变量存储区,所以递增,而局部变量存储在栈中,所以递减,这种理解对么??

int i,j,k;
void f()
{
int a,b,c;
long a1,a2,a3,a4,a5,a6;
a1 = (long)&i;
a2 = (long)&j;
a3 = (long)&k;
a4 = (long)&a;
a5 = (long)&b;
a6 = (long)&c;
}
void CFormDlg::OnButton1()
{
f();
}

a1 4286560
a2 4286556
a3 4286552

a4 1242708
a5 1242704
a6 1242700

这是我在vc6.0建的程序,为什么全局变量和局部变量的地址都是按照声明的顺序递减呢
另外,局部变量是存放在栈中的,那么我声明int a1,a2,a3;先把谁压栈,a1还是a3,谢谢!
...全文
1300 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangxipu 2009-12-01
  • 打赏
  • 举报
回复
依赖于编译器实现
可能2005不是这样的
freshui 2007-04-16
  • 打赏
  • 举报
回复
我觉得应该是这样
femalelover 2007-04-16
  • 打赏
  • 举报
回复
这是我在vc6.0建的程序,为什么全局变量和局部变量的地址都是按照声明的顺序递减呢
---------
这个我也不明白, 在More effective C++一书也有一些涉及, 不过楼主可以试试将全局的int i,j,k 写成 int i; int j; int k;
VC编译器做词法分析时是从右向左读入一行代码.
jixingzhong 2007-04-16
  • 打赏
  • 举报
回复
底层的细节可以不去考虑 ......

但是从理解上说,
全局变量存放在全局变量存储区,所以递增,而局部变量存储在栈中,所以递减
也是可以这么理解的。

全局变量等在 数据段,其增长方向为地址从小到达;
局部变量在 堆栈段, 其增长方向是从大地址到小地址......

楼主可以看看 C语言实用程序设计 一书,
比较老,但是有些东西还是可以作为参考的 ~
jixingzhong 2007-04-16
  • 打赏
  • 举报
回复
这个是机器相关的 ~
taodm 2007-04-16
  • 打赏
  • 举报
回复
C++标准没有对此作规定,不要依赖这一点。
iu_81 2007-04-16
  • 打赏
  • 举报
回复
在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。
ruodeer 2007-04-16
  • 打赏
  • 举报
回复
编译器相关呀。
lw1a2 2007-04-16
  • 打赏
  • 举报
回复
忘了是编译器相关还是机器相关来着了
blue_zyb 2007-04-16
  • 打赏
  • 举报
回复
但上面也是我在vc6.0上的结果,应该是编译器相关吧。。。
Chivalry 2007-04-16
  • 打赏
  • 举报
回复
a14286560
a24286556
a34286552

a41242708
a51242704
a61242700
------------------------------------
lz的程序并没有打印变量地址的语句啊,而且给出的地址也不是递减的嘛,a61242700明显就比a51242704大。


空格没有了,应该是这样
a1---4286560
a2---4286556
a3---4286552

a4---1242708
a5---1242704
a6---1242700
前边是变量,后面是地址,我是直接从vc监视器里复制过来的

blue_zyb 2007-04-16
  • 打赏
  • 举报
回复
int i,j,k;
void f()
{
int a,b,c;
long a1,a2,a3,a4,a5,a6;
a1 = (long)&i;
a2 = (long)&j;
a3 = (long)&k;
a4 = (long)&a;
a5 = (long)&b;
a6 = (long)&c;
}
void CFormDlg::OnButton1()
{
f();
}

a14286560
a24286556
a34286552

a41242708
a51242704
a61242700
------------------------------------
lz的程序并没有打印变量地址的语句啊,而且给出的地址也不是递减的嘛,a61242700明显就比a51242704大。

我在vc6下加入如下的打印语句:
cout << a1 << endl;
cout << a2 << endl;
cout << a3 << endl;
cout << a4 << endl;
cout << a5 << endl;
cout << a6 << endl;
输出的结果是:
4679480
4679484
4679488
8781608
8781604
8781600

也就是,全局变量的地址递增,而局部变量的地址递减。


至于lz提到的:
另外,局部变量是存放在栈中的,那么我声明int a1,a2,a3;先把谁压栈,a1还是a3,谢谢!
----------------------------------------------------------------
实际上并不存在显示的压栈动作,而是运行时直接将栈指针esp减去相应的数值就分配了对应大小的栈空间,只是一般先声明的变量更靠近ebp(也就是stack frame pointer),因而地址就越大

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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