【栈越界】变量未赋值前提下,值却发生改变??

发布时间:2024年01月04日

首先,提出2个问题:

  • 数组越界 和 栈越界是一回事吗?
  • 以上两种越界若有发生,程序一定会跑飞吗?

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 空间示意图

在这里插入图片描述

查看原文:
嵌入式软件工程师赶紧收藏起来,这篇文章能在关键时刻拉你脱坑!

文章来源:https://blog.csdn.net/qq_39217004/article/details/135377926
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。