全部博文(214)
分类:
2007-11-18 18:19:46
|
上面的程序中,变量确实是按字母顺序分配空间的。
但是如果在定义的时候把变量初始化:
#if ONE
int a=1 , b= 2;
#else
int b=1, a=2;
#endif // ONE
那么其地址顺序就是固定的,谁在前定义,它的地址就在前面。
综上我的结论是这样的:
这个和编译器在什么时候能够决定这是一个变量的定义有关。
在变量被初始化的时候,编译器在当前位置就能确定这是一个定义,所以立即为其分配空间。
而在变量未被初始化的时候,编译器在当前位置就不能确定这是一个声明还是定义,因为程序中可以写:
int a;
int a; //全局变量可以多次声明
int a;
那
么在什么时候能确定这是定义呢?C中是在link的时候(C++中也许编译单个文件就能确定),不管是哪一种,他的前提都是已经扫描完了所有的代码,并把
他们放入了符号表中,然后编译器开始从符号表中查看哪些变量是未定义的,如果没定义就补上定义,由于符号表是按字母顺序的,所以分配的变量也是按字母顺序
的。
-------------------------------------
测试:
如果上面的推测正确的话,那么:
int a, b=2;
b的地址应该在a的前面。(因为b在当前位置被定义,而a在查看符号表时才能确定)
实验结果:a的地址远远大于b 。
---------------------------
补充:程序中变量只能被定义一次,(所谓定义,就是为其分配空间),
所以在全局中遇到:
int a;
编译器不会立即认为其是定义,已防止后面遇到int a=1(如果遇到int a=1,这样必定是定义的语句,就会立即分配空间);而int a;(这种不能确定是定义还是声明的),如我前面所说,必须在后来找符号表时才能确定。