在微控制器架构中:用于SRAM存储器段: 我知道未初始化的全局变量是在SRAM的.bss段中分配的(并且初始化的变量在.data段中分配)。
所以,问题:在程序运行时更新全局变量的值时,
全局变量是否从.bss到.data段?
答案 0 :(得分:4)
没有。变量的位置由编译器设置。它确保对全局(和静态)变量的所有引用都指向正确的位置。
有两个段的原因是C运行时对它们的处理方式不同,编译器将一部分代码添加到程序中,并在跳转到代码之前运行。
初始化的变量位于数据部分。 C运行时具有一个功能,可以将程序代码空间末尾的值复制到这些变量的SRAM中。这些通常位于RAM的顶部。
未初始化的变量在程序代码中不需要这样的值。相反,C运行时运行一个函数,将所有这些变量初始化为0.(某些C运行时甚至不执行此操作。对于这些运行时,变量将在程序开始时具有SRAM中已有的任何值。)这些变量通常在初始化变量之后直接占用RAM。
RAM的结尾是堆栈,堆在未初始化的全局变量之后启动。通常,没有机制来阻止这些相互覆盖。这就是着名的“Stack Overflow”。