C程序编译后在内存的分布情况

c程序的执行需要经过预处理编译汇编链接四个步骤,这些步骤都是由编译器帮我们执行的,那么,一段程序在被编译器编译后在内存中是以什么方式存在的呢?

简单的说,c程序在编译完后分成代码区数据区

代码区存放着程序的指令,也就是函数体的二进制码。代码区有只读共享两个特点,其中只读是防止在代码执行过程中被修改了,共享则是为了让每次调用这段程序都能直接使用,减少内存损耗。

数据区可以分为data区(初始化的数据区)bss区(未初始化的数据区)
其中,data区存放着全局变量、静态变量以及字符串常量和const修饰的全局变量
bss区存放的是未初始化的数据,例如定义了一个整型变量 int a;没有给定初始值的情况下,会被初始化为0或null,存放在bss区中,直到在程序执行时被初始化。

注意:栈区和堆区是在程序执行时才产生的。
栈区是一种先进后出的数据结构,由编译器自动分配释放,用于存放函数的参数值、返回值和局部变量等,由编译器实时分配和释放。因此,局部变量的声明周期就是从函数执行到函数执行完毕这一段过程。

堆区不像栈区一样,它没有先进后出的特点,内存远大于栈区,是动态的内存空间,由程序员分配和释放,在程序结束时,若程序员没有释放,则由系统释放。关键词为malloc(申请内存)和free(释放内存)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值