首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-28 
全局变量和局部变量的存储地址问题。intdog,cat,bird,fishintmain(){inti,j,kcout dog: (long)&dog

全局变量和局部变量的存储地址问题。
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();
}

a14286560
a24286556
a34286552

a41242708
a51242704
a61242700

这是我在vc6.0建的程序,为什么全局变量和局部变量的地址都是按照声明的顺序递减呢
另外,局部变量是存放在栈中的,那么我声明int   a1,a2,a3;先把谁压栈,a1还是a3,谢谢!

[解决办法]
在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。
[解决办法]
底层的细节可以不去考虑 ......

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

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

楼主可以看看 C语言实用程序设计 一书,
比较老,但是有些东西还是可以作为参考的 ~
[解决办法]
这是我在vc6.0建的程序,为什么全局变量和局部变量的地址都是按照声明的顺序递减呢
---------
这个我也不明白, 在More effective C++一书也有一些涉及, 不过楼主可以试试将全局的int i,j,k 写成 int i; int j; int k;
VC编译器做词法分析时是从右向左读入一行代码.
[解决办法]
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),因而地址就越大

热点排行