全局变量和静态变量一般存储在读写段,不赋值自然存储在bss段,但是如果赋值为0的话存储在bss段,而不是读写段。
测试程序:
#include <stdio.h>
int global_a0=0;
int global_a1=1;
int global_anull;
int main(){
static int static_b0=0;
static int static_b1=1;
static int static_bnull;
printf("global_a0: %p\n",&global_a0);
printf("global_a1: %p\n",&global_a1);
printf("global_anull:%p\n",&global_anull);
printf("static_b0: %p\n",&static_b0);
printf("static_b1: %p\n",&static_b1);
printf("static_bnull:%p\n",&static_bnull);
return 0;
}
内存形态如下:
这里我们不讨论堆栈,那是存储局部变量的地方,上面程序在64位机器编译的结果为:
根据内存地址我们可以了解到(由于地址只有后两位不一样,我只写后两位地址。
结论:由此可以知道,global_a0和static_b0都存在bss段。
size命令(unix系统)可以查看bss段大小信息
size 可执行文件
例子:size a.out
可以看到bss段大小为24字节。数据段,text段同理。