嵌入式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. 内存访问越界

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

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

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嵌入式 C 语言开发学习路径和书籍文档如下: 1. 基础语言学习 C 语言作为嵌入式系统编程的主要语言,首先需要掌握其基础语法和编程规范。推荐的书籍包括《C程序设计语言》、《C和指针》、《深入理解C指针》等。 2. 嵌入式系统架构学习 嵌入式系统开发需要对硬件架构和系统设计有一定的了解。推荐的书籍包括《嵌入式系统设计》、《嵌入式系统开发实战》等。 3. 嵌入式系统编程 嵌入式系统编程需要掌握一些特定的编程技巧和应用。推荐的书籍包括《嵌入式C编程技术》、《嵌入式系统软件开发实战》等。 4. 操作系统学习 嵌入式系统中常常需要使用操作系统来管理资源和调度任务。推荐的书籍包括《嵌入式实时操作系统原理与实践》、《Linux嵌入式应用开发》等。 5. 设备驱动程序开发 设备驱动程序是嵌入式系统中重要的组成部分,需要掌握相关的开发技巧和应用。推荐的书籍包括《Linux设备驱动程序开发详解》、《嵌入式Linux驱动开发》等。 6. 调试和优化技术 嵌入式系统开发中需要掌握调试和优化技术,以保证系统的稳定和性能。推荐的书籍包括《嵌入式系统调试与优化》、《嵌入式软件调试与优化》等。 总之,嵌入式 C 语言开发需要学习多个方面的知识和技术,需要不断地进行实践和应用,才能真正掌握其精髓。在学习过程中应该积极参加开发者社区和论坛,与其他开发者交流和分享经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值