嵌入式C语言开发学习笔记 —— 内存陷阱

本文详细介绍了嵌入式系统中的内存分配方式,包括静态、栈、堆和绝对地址访问,并探讨了局部变量的陷阱,动态存储区的常见问题及解决策略,以及内存访问越界的后果。
参考:《嵌入式系统高级C语言编程》

目录

  1. 内存分配方式
  2. 局部变量
  3. 动态存储区
  4. 内存访问越界
1. 内存分配方式

(1)从静态存储区域分配。

  • 何时分配:程序编译时
  • 生存周期:整个程序运行期间
  • 例子:全局变量、static变量

(2)在(stack)上创建。

  • 何时分配:函数执行时
  • 生存周期:变量作用域期间

(3)在(Heap)上分配,即动态内存分配。

  • 何时分配:由程序员自己决定
  • 生存周期:由程序员自己决定
  • 用法:malloc(), free()

(4)对存储器绝对地址进行访问。

  • 系统程序员知道系统中每个程序单元在存储器中的位置,除了这个程序单元所占存储器的空间外,还存在一些空闲存储器空间。系统程序员可以通过绝对地址对这些空间进行访问。
  • 应用:将系统常数烧写在Flash或ROM特定地址。
     
2. 局部变量

局部变量的内存陷阱在于,C语言编译器在处理局部变量时,将其要么放在CPU通用寄存器中,要么放在堆栈中。而且局部变量的生存期有限。

注意事项

  • 由于无法确定编译器是否将局部变量映射到通用寄存器中,所以不要对局部变量作取地址操作。
  • 不要返回局部变量地址或局部指针变量,因为出了函数,存放在堆栈中的局部变量就没有意义了。
  • 不要申请大的局部变量数组,因为对于嵌入式开发而言,堆栈空间很小。
     
3. 动态存储区

动态存储区表示malloc()和free()函数管理的存储区。

动态存储常见问题

  • 释放
    □□ 释放未从malloc获得的内存;
    □□ 两次释放同一个指针;
    □□ 忘记释放内存,从而造成内存泄漏
  • 使用
    □□ 向malloc()分配的区域写入比所分配的还多的数据
    (踩被人的内存、分配块管理的头部数据被破坏,内存释放失败,从而造成内存泄漏)
    □□ 使用已经释放了内存的指针;
    □□ 被分配的内存未初始化,作右值使用;

如何规避

  • 总是检查内存释放分配成功后,再使用该指针;
  • 对于分配成功动态存储区域,初始化后再使用
  • 小心存储区的访问越界
  • 用sizeof来计算结构体的大小,分配内存时,宁滥勿缺。
  • 用完之后,记得释放;
  • 错误处理时,记得其它已经分配空间的释放
  • 对于被释放的动态内存区,将相关指针置为NULL,避免野指针的使用
     
4. 内存访问越界

读越界:读取了不属于自己的内存。

  • 如果内存是无效内存,程序会崩溃。
  • 如果内存是有效内存,由于数据是未知的,因此产生的后果也是未知的。

写越界:又叫缓冲区溢出。由于溢出的部分对于别人而言,是未知的,因此后果也是未知的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值