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

参考:
博文01:https://blog.csdn.net/u012800825/article/details/98054638
博文02:参考:《嵌入式系统高级C语言编程》 ,这本书有空好好看看

1. 内存分配方式

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

何时分配:程序编译时
生存周期:整个程序运行期间
例子:全局变量、static变量
(2)在栈(stack)上创建。

何时分配:函数执行时
生存周期:变量作用域期间
(3)在堆(Heap)上分配,即动态内存分配。

何时分配:由程序员自己决定
生存周期:由程序员自己决定
用法:malloc(), free()
(4)对存储器绝对地址进行访问。

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

2. 局部变量

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

注意事项:

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

3. 动态存储区

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

动态存储常见问题:

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

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

4. 内存访问越界

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

如果内存是无效内存,程序会崩溃。
如果内存是有效内存,由于数据是未知的,因此产生的后果也是未知的。
写越界:又叫缓冲区溢出。由于溢出的部分对于别人而言,是未知的,因此后果也是未知的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值