首先,提出2个问题:
- 数组越界 和 栈越界是一回事吗?
- 以上两种越界若有发生,程序一定会跑飞吗?
目录
- 1. 一个栈越界的例子
- 2. 程序的内存分部
- 3. RAM 空间示意图
1. 一个栈越界的例子
创建 STM32 工程并写了一段测试代码
char test_char = 0;
char i = 0;
int main(void) {
char test_data[1648];
test_char = 1;
test_data[0] = 100;
while (1) {
i++;
}
}
调试过程:
明明是给 test_data 的第一个元素赋值,结果 test_char 的值被修改了,并且 test_data 和 test_char 明明是两个完全不同的变量,再者,出现了这种错误程序也是正常运行的(i 正常计数),没有跑飞也没有进 hardfault!
2. 程序的内存分部
Total RO Size (Code + RO Data) 780 ( 0.76kB)
Total RW Size (RW Data + ZI Data) 1648 ( 1.61kB)
Total ROM Size (Code + RO Data + RW Data) 796 ( 0.78kB)
可以看到,程序编译完成后 RW 的大小正好是1648!而这个 RW 区域到底包含了哪些东西?这里需要了解一个知识点,即此处的 RW(RW Data + ZI Data) 实际上在运行过程中处于我们的 RAM 区域。
在测试程序中定义的临时变量 test_data 为1648 个字节的大小,与整个 RAM 区的大小相等,也就是说,其会冲破栈区的大小限制,并且侵占整个 RAM 区:
3. RAM 空间示意图
查看原文:
嵌入式软件工程师赶紧收藏起来,这篇文章能在关键时刻拉你脱坑!