将const int转换为指针?

时间:2012-05-29 03:32:14

标签: c++ pointers casting

  

可能重复:
  Modifying a const through a non-const pointer

我有以下代码:

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 1存储数字2的位置?

3 个答案:

答案 0 :(得分:10)

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

你做过:

*p = 2; // Line 1

所有投注都已关闭,您的代码不再是有效的C ++代码。一旦编写该行,您就不能指望任何特定的行为。推测为什么未定义行为给出任何特定行为是没有意义的,因为它允许显示任何行为 [Ref#2] ,这是未定义行为< / em>的


[参考#1]
C ++ 03标准7.1.5.1 cv-qualifiers:
第4段:

  

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

[Ref#2]
C ++ 03标准1.3.24:

  

允许的未定义行为包括完全忽略不可预测的结果,在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的文件化方式行事,终止翻译或执行(发布诊断信息)。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

虽然有些编译器会为const值分配一个地址,但访问它是一个很大的禁忌。你得到5-2的原因是因为编译器直接用5代替x,即使你修改了地址,如果它不是const,那么x将被赋予一个地址,除非你通过p *访问x的值,你将会无论你做什么,每次都得到5 - 而且,p *可能会产生一个未定义的值,因为获取const的地址实际上可能会失败一些编译器(我认为它应该与所有这些编译器一起使用)