0

可能重复:
通过非常量指针修改 const

我有以下代码:

const int x = 5;
int *p = (int*)&x;

*p = 2; // Line 1

cout << x << " - " << *p << endl;
cout << &x << " - " << p << endl;

并得到了结果:

5 - 2
0012FF28 - 0012FF28

我知道代码很奇怪,永远不应该这样做。但我想知道为什么相同的地址却得到不同的结果?Line 12号店在哪里?

4

3 回答 3

10

因为无论如何更改固有const变量的值都是未定义的行为[Ref #1]

一旦你做了:

*p = 2; // Line 1

所有的赌注都没有了,您的代码不再是有效的 C++ 代码,一旦编写了该行,您就不能期望任何特定的行为。推测为什么 Undefined Behavior 给出任何特定行为是没有意义的,因为它允许显示任何行为[Ref #2],这就是Undefined Behavior的含义。


[参考 #1]
C++03 标准 7.1.5.1 cv 限定符:
第 4 段:

除了可以修改任何声明为 mutable (7.1.1) 的类成员外,任何在 const 对象的生命周期 (3.8) 期间修改它的尝试都会导致未定义的行为。

[参考 #2]
C++03 标准 1.3.24:

允许的未定义行为的范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特征的记录方式表现(有或没有发出诊断消息),到终止翻译或执行(发出的诊断消息)。

于 2012-05-29T03:34:06.673 回答
1

声明某事const使编译器允许假定该值不会改变。这意味着他们可以使用“立即”指令来加载值5,而不是引用分配给的位置(如果有的话)x

此外,修改 aconst违反了您向编译器提供的保证,即该“变量”不会被修改,并且可能产生各种意外行为。

于 2012-05-29T03:38:43.560 回答
1

while some compilers do allocate an address for const values, it is a big no-no to access it. the reason you get 5-2 is because the compiler is replacing x directly with 5, even though you modified the address where x would have been given an address if it were not const and unless you access x's value through p* you are going to get 5 every time no matter what you do - also, p* may yield an undefined value since the getting the address of a const may actually fail with some compilers (and i think it should with all of them, personally)

于 2012-05-29T03:41:35.587 回答