博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
必须知道的C语言知识细节:C程序编译后内存到底是如何布局
阅读量:3943 次
发布时间:2019-05-24

本文共 849 字,大约阅读时间需要 2 分钟。

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,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。

转载地址:http://wdjwi.baihongyu.com/

你可能感兴趣的文章
文章中运用到的数学公式
查看>>
Projective Dynamics: Fusing Constraint Projections for Fast Simulation
查看>>
从2D恢复出3D的数据
查看>>
glm 中 数据类型 与 原始数据(c++ 数组)之间的转换
查看>>
Derivatives of scalars, vector functions and matrices
查看>>
the jacobian matrix and the gradient matrix
查看>>
VS2010 将背景设为保护色
查看>>
ubutun里面用命令行安装软件
查看>>
ubuntu 常用命令
查看>>
SQLite Tutorial 4 : How to export SQLite file into CSV or Excel file
查看>>
Optimizate objective function in matrix
查看>>
Convert polygon faces to triangles or quadrangles
查看>>
read obj in matlab
查看>>
find out the neighbour matrix of a mesh
查看>>
Operators and special characters in matlab
查看>>
As-Conformal-As-Possible Surface Registration
查看>>
qmake Variable Reference
查看>>
Lesson 2 Gradient Desent
查看>>
find border vertex
查看>>
matlab sliced variable
查看>>