This question already has answers here:
Two different values at the same memory address
(7 个回答)
3年前关闭。
我知道使用
两个指针具有相同的地址值,但在取消引用时,给出不同的数据值。
有没有人对此有解释?
代码
输出
在这种情况下,
(7 个回答)
3年前关闭。
我知道使用
const_cast
通常是个坏主意,但我在玩它时遇到了一个奇怪的行为,其中:两个指针具有相同的地址值,但在取消引用时,给出不同的数据值。
有没有人对此有解释?
代码
#include <iostream>
int main()
{
const int M = 10;
int* MPtr = const_cast<int*>(&M);
(*MPtr)++;
std::cout << "MPtr = " << MPtr << " (*MPtr) = " << (*MPtr) << std::endl;
std::cout << " &M = " << &M << " M = " << M << std::endl;
}
输出
MPtr = 0x7fff9b4b6ce0 (*MPtr) = 11
&M = 0x7fff9b4b6ce0 M = 10
最佳答案
因此,除了“它是未定义的行为”(它是)之外,编译器完全可以使用 M
是一个常量的事实,因此在 cout ... << M << ...
的评估中不会改变,因此可以使用具有立即数 10,而不是存储在 M
内存中的实际值。 (当然,标准不会说这是如何工作的,更多的是“未定义”,并且编译器能够在不同的情况下选择不同的解决方案等等,所以如果你修改,你完全有可能得到不同的结果代码,使用不同的编译器,不同版本的编译器或风向不同的方向吹)。
“未定义行为”的部分棘手之处在于它包括“完全符合您的预期”以及“几乎符合您的预期”的事物。如果编译器发现这是您正在做的事情,它也可以决定启动俄罗斯方块。
是的,这就是您不应该使用 const_cast
的原因之一。至少不是在最初是 const
的东西上 - 如果你有这样的东西就可以了:
int x;
void func(const int* p)
{
...
int *q = const_cast<int *>(p);
*q = 7;
}
...
func(&x);
在这种情况下,
x
实际上不是 const,当我们将它传递给 func
时,它只是变成了 const。当然,编译器可能仍然假设 x
在 func
中没有改变,因此你可能会遇到问题......关于c++ - const_cast 的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22391423/