【问题标题】:Variable has two values simultaneously?变量同时有两个值?
【发布时间】:2017-06-30 20:43:49
【问题描述】:

我在网上遇到了这个例子,但我不知道它是如何影响我的生活的。

#include <iostream>

int main()
{
    int const a = 1;
    int* pa = (int*) &a;
    *pa = 2;
    printf("%p %d %p %d", (void*) &a, a, (void*) pa, *pa);
    return 0;
}

当我在我的机器上编译它时,我得到:

0xffffcc04 1 0xffffcc04 2

这意味着内存位置0xffffcc04同时具有值​​1和2???编译器优化了a,还是我遗漏了什么?

附:当我在调试中运行它时,a*pa 是 2...

【问题讨论】:

  • 欢迎来到未定义行为的奇妙世界!你不能那样做。
  • 代码只是有一个错误。如果你修复了这个错误,谜团就会消失。
  • 当你打开警告时,这段代码输出了多少警告?你总是在编译时出现警告?
  • 编译器正在优化 a。由于您将其声明为const,它知道它可以在任何看到它的地方将a 替换为1
  • 对编译器撒谎是不值得的。

标签: c++ pointers


【解决方案1】:

更改const-value 会产生未定义的行为,而“神秘”的输出就是这种未定义的行为。 实际上,无需研究为什么在未定义行为的世界中的行为会如此。但是在您的情况下,它可能没有使用a,因为您将其声明为const,因此编译器“知道”该值并可能决定不访问该变量。 只是为了展示一些好奇的东西,试试:

int main()
{
    volatile int const a = 1;
    int* pa = (int*) &a;
    *pa = 2;
    printf("%p %d %p %d", (void*) &a, a, (void*) pa, *pa);
    return 0;
} 

【讨论】:

  • 感谢您的建设性回答,非常有意义。这有点切线,但是 volatile const 的目的是什么?例如,是否会设置对某种硬件的只读访问?如果我违反了规则,请原谅我,我大约一个月前才开始使用 C++ :)
  • 是的,对硬件的只读访问将是一个用例。但实际上我想展示编译器优化如何影响感知行为(即使未定义:-))
  • 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 2021-03-22
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多