背景:
近期一位朋友在调试时遇到了死机的情况,在查找后发现是一个局部变量数组过大造成的。将数组换成全局变量问题瞬间解决。局部变量过大导致死机是很多新手会犯的错误,下面我们就聊聊局部变量导致的死机问题。
根因分析:
要搞懂这个首先要搞懂全局变量与局部变量在RAM中的存储位置,看下图。
栈区:
1,存放函数的局部变量、参数、返回值。
堆区:
动态分配,malloc分配free释放
.bss:
1,未初始化或者初始化为0的全局变量;
2,未初始化或者初始化为0的静态变量;
.data:
1,初始化为非0的全局变量;
2,初始化为非0的静态变量;
以stm32f103c8为例看一下RAM、栈、堆大小。
RAM大小是0x5000,stack大小是0x400,heap大小是0x200。
全局区比stack、heap都要大。这就是为何局部变量会导致死机,改为全局变量就没事了。