1.栈区(stack) --编译器自动分配释放,主要存放函数的参数值,局部变量值等;
2.堆区(heap) --由程序员分配释放;
3.全局区或静态区 --存放全局变量和静态变量;程序结束时由系统释放,分为全局初始化区和全局未初始化区;
4.字符常量区 --常量字符串放与此,程序结束时由系统释放;
5.程序代码区
++++++++++++++++++++++引用自csdn的blue_zyb()++++++++++++++++++++++
初始化的放在data段,未初始化的放在bss段(初始化为0的也可能放在bss段)
对于初始化的global变量,例如int x = 10;
那么10这个数据必须在目标文件中保存起来,然后在OS程序加载的时候,复制到相应的内存。10这个实际的数据就会保存在目标文件中的data段。
而如果是未初始化的数据(也就是说初始值0是合适的),就没有必要在目标文件中保存0这个值,而只需要记录一个字节数,来告诉OS有多少字节需要在程序加载到内存的时候清空为0。这些信息就保存在bss段。
bss段主要是为了节省程序的目标文件或者说可执行文件所占的磁盘空间。
对于单个变量可能不明显,但当情形是初始化和未初始化的大型数组时,例如
int ar0[10000] = {1, 2, 3, ...};
和
int ar1[10000];
时,
把ar1放在bss段,只记录共有10000*4个字节要初始化为0,而不是像ar0那样记录每一个数据1,2,3...,那么bss为目标文件所节省的磁盘空间还是相当可观的。