gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:53:49 24 4
gpt4 key购买 nike

我编写了一个简单的代码,声明 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com