必须知道的C语言知识细节:C程序编译后内存到底是如何布局

C语言程序编译以后,代码和数据都必须存放在内存中由CPU执行。理解C程序内存是如何划分布局,才能真正理解C语言中变量、存储类型、指针等底层知识点。

一个C语言程序编译后,可执行文件中运行时内存空间按照以下规律进行连续划分布局。以下各区域内存地址按照从小地址到大地址空间排列。

1.文本段

也称为代码区,存放C程序编译的二进制指令代码,例如定义的各种函数体内的代码翻译成CPU指令后存放在该区域。

2.数据段

存放经过初始化的全局变量和静态变量的值。C语言中初始化的全局变量和静态变量内存分配在这个区段,初值也保存在这里。

3.BSS段

Block Started by Symbol的缩写,中文译为符号开始的块,该区域保存未初始化的全局变量和静态变量,BSS段在可执行文件中将直接记录内存大小,当调入程序执行时,动态分配为BSS段分配指定大小的内存,使用完毕后释放。

备注:数据段和BSS段统称为数据区,BSS段主要是用来减少可执行文件本身的大小。

4.堆区

英文heap,C程序中动态内存申请和分配的区域,例如C语言程序中使用malloc,realloc,calloc和free函数进行手动内存申请和分配时,就分配在该区,如果申请后,未及时释放,该区域内存将一直占用,直到程序结束为止。这里的heap堆和数据结构中的堆完全不是一个概念。

5.栈区

英文stack,该区域内存是由编译器自动管理分配和释放的,局部变量、函数参数、函数调用等都是存放在该区域,内存操作方式和数据结构的栈类似,后进先出。当函数调用时分配栈内存空间,当函数调用返回时栈内存空间释放。

当然除此之外,C程序中还隐藏一部分低地址内存空间,该内存空间无法在C程序中进行访问,用于观察空指针、非法内存访问等情况,当程序访问该内存空间时,程序会出现非法内存访问等错误。

其实做为一个学习者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C/C++基础交流583650410,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。



你可能感兴趣的:(必须知道的C语言知识细节:C程序编译后内存到底是如何布局)