C语言程序的内存布局
我们编写的C程序属于编译型语言,需要将编写好的C程序经过编译、汇编、链接,最后生成二进制机器码,这个可以被操作系统识别,并加载到内存中执行。经过编译后的C程序由主要由以下几部分组成:BSS 段、data段、text段。
BSS段
data段
text段
其中:
text即为代码段,为只读
bss段包含程序中未初始化的全局变量和static变量
data段包含三个部分:heap(堆)、stack(栈)和静态数据区。
堆(heap)
栈 (stack)
静态数据区
text和data段都在可运行文件里(在嵌入式系统里通常是固化在镜像文件里)。由系统从可运行文件里载入;而BSS段不在可运行文件里,由系统初始化。
bbs段仅仅保存没有值的变量。所以其实它并不需要保存这些变量的映像。执行时所需要的BSS段大小记录在目标文件里,但BSS段并不占领目标文件的不论什么空间。
1int a = 0; //全局初始化区
2char *p1; //全局未初始化区
3
4main()
5{
6 static int c =0; //全局(静态)初始化区
7 int b; //栈
8 char s[] = "abc"; //栈
9 char *p2; //栈
10 char *p3 = "123456"; //"123456\0"在常量区,p3在栈上。
11 p1 = (char *)malloc(10);
12 p2 = (char *)malloc(20); //分配的10和20字节的区域就在堆区。
13}