C编程为什么++操作后局部变量在调试器中不可用?

标签 c iar

我编写了一个简单的代码,声明 21 个局部变量并执行++ 操作,以便编译器不会显示错误。 但问题是,当我继续调试时,我的本地显示该值不可用或错误,但寄存器窗口显示我的操作已正确完成。我使用 IAR IDE for arm ,我正在使用 ARMv7 cortex M4 。

代码是:

int main(){
int C1=0;

.
.
.

int C21=0;

C1++;

.
.
.

C21++;


}

befor doing the ++ op

after doing the ++ op

最佳答案

局部变量可以放置在寄存器中并且永远不会到达内存。局部变量可能位于堆栈上。局部变量可能存储在其他地方。

C 标准没有指定这样的事情。该标准仅讨论变量的生命周期,即访问变量的有效时间。堆栈的概念甚至不是标准的一部分 - 换句话说,兼容的 C 实现不需要有堆栈。

只要不改变程序的可观察行为,编译器就可以进行各种优化。我认为这正是您的情况所发生的情况,因为这包括让不再使用的变量变得不可用。

示例:

int a, b;
for (a=0; a<10; ++a)
{
    // Do something not involving variable b
}
for (b=0; b<10; ++b)
{
    // Do something not involving variable a
}

在这种情况下,编译器可以对变量ab使用相同的寄存器。在第二个循环开始之前,变量 b 将“不可用”,而当第二个循环开始时,变量 a 将“不可用”。这将是一个完美有效的编译器优化。

一般来说:当调试器说“不可用”或“优化”或类似内容时,这意味着该变量不再使用(即未存储在任何地方)。

您可以尝试在返回之前添加所有变量的打印。通过这种方式,编译器可能(但仍不能保证)保持变量可用,以便您可以在调试器中看到它们。

但是,由于您的程序不会产生任何输出,因此编译器可以将其优化为 return 0;

关于C编程为什么++操作后局部变量在调试器中不可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45280769/

相关文章:

c - 饱和减法 - AVX 或 SSE4.2

c - 在 C 中的变量中定义的数组大小无法在 IAR 中编译,但在 Keil 中构建良好

c - C 程序中的功能 block 架构

c - 如何在 C 中正确显示 groupID (GID)?

c - bpkt ARM 指令卡住了我的嵌入式应用程序

c++ - 我在微 Controller stm32f373 发现中点亮 LED 时遇到问题

file - 错误[P​​e020] : identifier "FILE" is undefined in IAR Workbench

c - 对数组执行操作

c - Doxygen:成员 my_function 的参数未(全部)记录在案

c - 从 C 中的函数返回一个数组