未初始化或者初始化为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权威指南》
[解决办法]
全局的自不必说
静态的同上