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

未初始化可能初始化为0的全局变量在BSS段

2013-03-19 
未初始化或者初始化为0的全局变量在BSS段?#include stdio.hint a 0int bint c 5int main(){stati

未初始化或者初始化为0的全局变量在BSS段?
#include <stdio.h>

int a = 0;
int b;
int c = 5;

int main()
{
static int d = 0;
static int e;
static int f = 5;

printf("%p\n", &a);
printf("%p\n", &b);
printf("%p\n", &c);
printf("%p\n", &d);
printf("%p\n", &e);
printf("%p\n", &f);

return 0;
}

运行结果:

00404014
00404010
00402000
00404018
00404028
00402004
[解决办法]
BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。
数据段(data segment)通常是指用来存放程序中已初始化且不为0的全局变量的一块内存区域。
[解决办法]
未初始化的全局变量在BSS段, 其中数据一般被系统初始化为 0
[解决办法]
参考程序员的自我修养
[解决办法]
LS的都说了。

[解决办法]
VC编译生成的PE格式没有像elf格式有一个专门命名的BSS段

VC中未初始化的全局静态量也在.data段中,用virtual size - raw size属性的大小描述
具体的PE中每个段都有raw size 和 virtual size 两个属性,对.data段来说,初始化的静态全局占据raw size,而大部分virtual size - raw size的区域就代表未初始化的静态量,loader加载时这部分全部清零

磁盘文件也不会在.data中填充这部分未初始化的数据,其大小用.data段的virtual size - raw size属性表示
[解决办法]
未初始化的全局变量放在BSS段, 被初始化为 0,不占用磁盘空间,加载到内存后才分配空间。
[解决办法]
《程序员的自我修养——链接、装载与库》
《Windows PE权威指南》
[解决办法]
全局的自不必说
静态的同上

热点排行