单片机堆栈溢出到底多可怕

程序一般存放在flash中,但在内存中运行

程序一般由这几部分组成:变量/常量/宏定义/动态区/代码

单片机堆栈溢出到底多可怕_第1张图片

#define:宏定义,不占用内存空间;因为宏在预处理阶段就会被替换掉,可执行程序中不存在宏定义,因此,不占用内存空间

float Num 与 Char *str,全局变量,存在于内存的变量区

函数体内部的int time:是一个局部变量,存在于栈区

char *path_0=“D:Pro/”: 字符串常量,存在于常量区

int Tol_Num[8]: 局部变量,存在于栈区

str = (char*)malloc(10): 生成的动态内存,存在与堆区

static float conn = 0.0: 生成的静态变量,存在于变量区

后面为调用的函数,存在于代码区

单片机堆栈溢出到底多可怕_第2张图片

体会:

1. 关于栈区,局部变量不要定义的太大,尤其是一些数组变量,如果定义的非常大,就会占用非常大的栈区空间,在程序运行的时候,非常容易出现栈区溢出。程序运行时,不可避免的去调用一些函数,调用函数时,尽量不要用深层次的调用,因为在调用函数时,栈区会不停的存储/调用函数相关的变量/地址之类的内容,如果有深层次的迭代递归需要,尽量采用别的方式替代

2. 关于堆区:在申请动态区域的时候,一定要记得释放它,如果没有释放,则这一块内存区域不可用,导致内存泄漏;在释放的时候,只能释放一次,不要重复释放。内存一点被释放,就可用于干别的事情,如果一个地方释放一次,别的地方再次释放时,就容易出现问题,在释放完后,再把指针指向空地址,这样可以避免下次再次使用指针的时候出现地址错误。

3. 关于访问越界:刚才示例程序中,特别加了依据strcpy语句,即后面锁使用的字符串的大小与前面申请的动态空间的大小需要匹配。还有sprintf,strcat字符串后缀,数组,这些都可以造成访问越界,编译的时候检测不出来,运行的时候就会发现内存泄漏

4. 程序变量与内存分配

 

 

 

 

 

你可能感兴趣的:(嵌入式)