【发布时间】:2017-03-15 18:16:10
【问题描述】:
this question 上的 answer 解释了如何通过取消引用指向其地址的指针来更改常量变量(显然是通过创建新变量)。
const int i = 10;
*(int *)&i = 5;
std::cout << &i << "\t" << i << "\n"; // 0x7fff6b325244 10
std::cout << &*(int *)&i << "\t" << *(int *)&i << "\n"; // 0x7fff6b325244 5
使用&*(int *)&i,我试图获取上一个答案所讨论的新变量的地址。如何找到这个新变量的存储位置?
*(int *)&i 显示不同的值,因此必须有一个新变量。
在 g++ 5.4.0、Ubuntu 16.04 上编译
【问题讨论】:
-
未定义的行为。
-
有很多去引用和重新引用。小心。
-
@AdityaGulavani 这就是未定义行为的定义——你无法预测的行为。
-
推理未定义的行为是浪费时间。
-
"正在显示不同的值,因此必须有一个新变量。" -- 不,没有。由于您对编译器撒谎并告诉它
i的值永远不会从 10 更改,因此在您请求i的值的任何地方都可以简单地使用常量值 10。它不需要变量。