C语言的内存分布模型

本文详细介绍了C语言中的内存分布模型,包括栈、堆、BSS和Data段,以及它们在STM32中的存储特点和使用情况。特别提到,STM32的Flash作为ROM存储文本段(只读)、Data和BSS,而RAM则用于运行时堆栈和可变数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. C的内存分布模型

C的内存分布模型主要有5个:

  1. stack (栈)
  2. heap (堆)
  3. BSS(Uninitialized data segment)
  4. Data(Initialized data segment)
  5. Text(程序代码区)

 

 2.各个模型介绍

2.2 栈(stack)

(1)栈是由编译器自动分配和释放的,存放局部变量,函数的参数、返回值

(2)当发生函数调用时,会创建栈,堆包含函数的局部变量参数和返回值;

(3)栈的操作方式类似数据结构中的栈,后进先出,函数变量在调用时被推送到堆栈中,函数变量在返回时从堆栈中弹出;

(4)SP(stack pointer),堆栈指针始终指向栈的顶部;

(5)栈由高地址(栈底)向低地址(栈顶)生长;

2.2 堆(heap) 

(1)堆是由程序员手动分配和释放,这个不同于数据结构中的堆,分配方式类似链表,由malloc(C语言)或 new(c++)来分配,free(c语言)和delete(c++)释放,若程序员不释放,程序结束后由系统释放。

(2)堆由低地址向高地址生长,和栈相反;

2.3 BSS(Uninitialized data segment)

(1)BSS段存放没有初始化的全局变量和静态变量,程序结束后由系统释放

(2)该段的变量在系统启动的时候被初始化为0再加载到内存中;

2.4 Data(Initialized data segment)

(1)DATA段存放初始化的全局变量和初始化静态变量,程序结束后由系统释放

(2)它具有读写权限,因此可以在运行时更改该段的变量值

2.5 Text(程序代码区)

(1)程序代码区存放函数体的二进制代码、以及常量;

(2)文本段是一个只读段,它在程序的执行过程中一般不会改变,用于防止程序被意外修改

3.text data bss dec 代表的含义

在stm32中flash就是ROM,掉电数据不会丢失(通常保存着text段、Code、Ro-data、Rw-data)

RAM就是运行内存,掉电数据就丢失(通常保存着堆、栈、bss段、data段、ZI-data、RW-data)

实际编译结果如下图所示:

其中:

1、text文本段:编译后的二进制程序源码,烧录后存放在FLASH存储器中,程序执行时由加载器(loader)从可执行文件拷贝到内存中,为了安全考虑,防止别的区域更改代码区数据(即可执行指令),代码区具有只读属性。

2、data数据段:包含了经过初始化的全局变量和静态变量,以及他们的值当单片机启动的时候data段会被拷贝到内存的相应位置

3、bss段:包含未经初始化的全局变量和静态变量单片机启动的时候被初始化为0再分配到内存中

以上3部分内存在程序运行器件会一直存在

4、dec段:dec(decimal的缩写,即十进制数)是text、data和bss的算术和:2080+196+1796=4072

 5、hex段:是text、data和bss的算术和的十六进制表示,4072用十六进制表示就是0xfe8。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原海青木

你的鼓励将是我创作的最大动力.

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值