软讯网络 > 编程语言 > C/C++ > 全局变量的内存分配问题
【标 题】:全局变量的内存分配问题
【关键字】:
【来 源】:http://www.cublog.cn/u/17131/showart.php?id=244072
全局变量的内存分配问题
局部变量在栈中的分配是按地址从高到低进行的,那么全局变量呢?
下面是我在vc6.0环境下编译运行的程序,对于以下各种情况出现的
结果很不明白,为什么会有这种变化呢?
//case 1:
#include<stdio.h>
int x;
int y;
int main()
{
printf("%d\n",&x);
printf("%d\n",&y);
}
//输出是:4339624
4339620
//case 2:
#include<stdio.h>
int x;
int y=0;
int main()
{
printf("%d\n",&x);
printf("%d\n",&y);
}
//输出是:4339620
4339624
//case 3:
#include<stdio.h>
int x;
int y=1;
int main()
{
printf("%d\n",&x);
printf("%d\n",&y);
}
//输出是:4339620
4337036
//case 4:
#include<stdio.h>
int x=1;
int y=1;
int main()
{
printf("%d\n",&x);
printf("%d\n",&y);
}
//输出是:4338024
4338028
-----------------------------------------------
事实上,全局变量不管有没有被初始化,其实都是被存放在DATA这个域中的,但是唯一不同的是这个DATA数据域有的时候又被划分成几个小的区域(说有的时候是因为并不是所有的系统都一定会这样做),分成initialized和un-initialized,甚至还有bss.
在你的CASE1中,
由于x,y实际上都没有被初始化,所以他们都被存在在同一个区域中,同时因为32位系统上int占用4个字节,所以你可以看到他们两个的地址是连续的;
在你的CASE2中,
由于y被初始化,而且被初始化成0,所以y实际被存放在BSS域中,而x依然被存在在un-initialized域中,所以你看到他们的地址不是连续的
在你的CASE3中
和CASE2不同的是,y被初始化成1,而不是0,这就字节导致y被从BSS域移出,而被重新存放到initialized域中,所以你看到他们地址不仅不连续,而且还和CASE2的不同的原因。
至于CASE4,
和CASE1一样,会被存放到initialized域中,所以他们的地址又开始连续了;
需要特别声明一点的是,这样的行为并不是通行的,因为有些系统在具体实现的时候可能并不会将整个DATA域划分成这么多的子区域,但是大多数PC系统中却还是遵循我们上面的原则的,嵌入式领域就不尽相同。
【相关文章】
没有相关文章