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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/boyaaboy/article/details/102665731

参考:
博文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()分配的区域写

猜你喜欢

转载自blog.csdn.net/boyaaboy/article/details/102665731