说明:
1、.bss 不占执行文件的空间,只是记录数据所需空间的大小。bss区域的的数据由OS初始化为0;
2、.data 占可执行文件的空间,其内容由程序初始化。
所以,全局变量是否初始化(初始化为非0值),将影响可执行文件的大小。
// 头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HEAP_ZONE_DATA 100
// 全局变量--全局区
int g_var1 = 0x12; //.data区
int g_var2 = 0; //.bss区
int g_var3; //.bss区
// 全局静态变量--全局区
static int g_static_var4 = 0x34; //.data区
static int g_static_var5 = 0; //.bss区
static int g_static_var6; //.bss区
// 全局常量--全局区
const int g_const_var7 = 0x56; //常量区
const int g_const_var8 = 0;
// const int g_const_var9; //常量必须初始化
// 打印全局区数据的地址信息
void test1_printGlobalZoneAddr()
{
// 静态局部变量--全局区
static int static_var10 = 0x78;
static int static_var11 = 0;
static int static_var12 ;
printf("----------------------Begin:Global Zone Addr----------------\n");
printf("addr global var inited nonzero-value \t0x%llx\n", &g_var1);
printf("addr global var inited zero-value \t0x%llx\n", &g_var2);
printf("addr global var none inited \t\t0x%llx\n", &g_var3);
printf("addr global static var inited nonzero-value \t0x%llx\n", &g_static_var4);
printf("addr global static var inited zero-value \t0x%llx\n", &g_static_var5);
printf("addr global static var none inited \t\t0x%llx\n", &g_static_var6);
printf("addr global const var inited nonzero-value \t0x%llx\n", &g_const_var7);
printf("addr global const var inited zero-value \t0x%llx\n", &g_const_var8);
// printf("addr global const var none inited 0x%llx\n", &g_const_var9);
printf("addr local static var inited nonzero-value \t0x%llx\n", &static_var10);
printf("addr local static var inited zero-value \t0x%llx\n", &static_var11);
printf("addr local static var none inited \t\t0x%llx\n", &static_var12);
printf("----------------------End:Global Zone Addr----------------\n\n");
}
// 打印栈区数据的地址信息
void test2_printStackZoneAddr()
{
// 局部变量--栈区
int i_var13 = 0x9a;
int i_var14 = 0;
int i_var15 = 0;
// const修饰局部变量-- 栈区
const int i_const_var16 = 0x9a;
const int i_const_var17 = 0;
// const int i_const_var18; //常量必须初始化
printf("----------------------Begin:Stack Zone Addr----------------\n");
printf("addr local var inited nonzero-value \t0x%llx\n", &i_var13);
printf("addr local var inited zero-value \t0x%llx\n", &i_var14);
printf("addr local var none inited \t0x%llx\n", &i_var15);
printf("addr const local var inited nonzero-value \t0x%llx\n", &i_const_var16);
printf("addr const local var inited zero-value \t0x%llx\n", &i_const_var17);
// printf("addr const local var none inited \t0x%llx\n", &i_const_var18);
printf("----------------------End:Stack Zone Addr----------------\n\n");
}
// 打印堆区数据的地址信息
void test3_printHeapZoneAddr()
{
char *p1 = (char *)malloc(HEAP_ZONE_DATA);
printf("----------------------Begin:Heap Zone Addr----------------\n");
printf("Heap addr \t\t0x%llx\n", p1);
printf("----------------------End:Heap Zone Addr----------------\n\n");
free(p1);
p1 = NULL;
}
int main ()
{
test1_printGlobalZoneAddr();
test2_printStackZoneAddr();
test3_printHeapZoneAddr();
system("pause");
return 0;
}