全局變量和靜態變量一般存儲在讀寫段,不賦值自然存儲在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段同理。