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

时间:2017-07-24 12:33:40

标签: 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

1 个答案:

答案 0 :(得分:2)

局部变量可以放在寄存器中,永远不会命中内存。局部变量可能在堆栈上。局部变量可以存储在其他地方。

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将无法使用&#34;直到第二个循环开始,变量a将变为&#34;不可用&#34;当第二个循环开始。这将是一个完美有效的编译器优化。

一般情况下:当调试器说出&#34;不可用时#34;或&#34;优化&#34;或类似的,这意味着该变量不再使用(即不存储在任何地方)。

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

但是,由于您的程序没有产生任何输出,因此允许编译器将其优化为return 0;