Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 全局变量的内存分配问题
【标  题】:全局变量的内存分配问题
【关键字】:
【来  源】:http://www.cublog.cn/u/17131/showart.php?id=244072

全局变量的内存分配问题

Your Ad Here
局部变量在栈中的分配是按地址从高到低进行的,那么全局变量呢?

下面是我在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系统中却还是遵循我们上面的原则的,嵌入式领域就不尽相同。
DB2的几个命令(不断更新中):【上一篇】
关于指针常量,常量指针在编程时遇到的问题:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • PhotoImpact 10 视频教程-编辑HTML文字
  • 系统的运行级别
  • [Share]Sysdeo Eclipse Tomcat Launcher plugin
  • Coinstor Backup Server数据容灾解决方案
  • XML简介
  • Lotus认证介绍
  • 深入理解c语言指针的奥秘
  • 07黑客<谁动了我电脑>网上骗局A 三
  • Ultradev实例教程:1.4 Ultradev的安装
  • Linux内核源代码漫游
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.