在C ++中修改const int

时间:2014-02-18 00:52:37

标签: c++ pointers const

运行以下代码显示& x = ptr,那么为什么x和* ptr不相等?

const int x=10;
int* ptr =(int*) &x;
*ptr = (*ptr)+1;

cout << &x << " " << x << "  " << ptr <<"  " <<*ptr;  //output : 0012FF60 10  0012FF60  11

2 个答案:

答案 0 :(得分:5)

您正在修改声明为const的对象。这是未定义的行为;该计划不需要做任何明智的事情。它可能看起来工作正常,或给出错误的错误答案,或段错误,或执行攻击者提供的任意代码。通常夸张的是允许程序让demons飞出你的鼻子。

答案 1 :(得分:4)

只有遵守规则,才需要C ++实现才能使程序正常工作。你违反了规则。 C ++实现可能会以这种方式运行:

  • 因为x被声明为const,所以只要您遵守规则,C ++实现就知道它的值不会改变。因此,在使用x的任何地方,C ++实现使用10而不用费心去检查x是否已更改。
  • 因为*ptr指向非const int,所以存储它并从中读取实际执行。这些“工作”因为它指向的内存(表示x)实际上并未被操作系统标记为只读。因此,尽管你不应该这样做,你仍然可以进行修改。

请注意,如果遵守规则,C ++实现的行为将。如果你没有修改x,那么在x使用10就可以正常工作。或者,如果您尚未将x声明为const,则C ++实现不会假设它始终为10,因此只要访问x,它就会获得更改的值。这是实现的所有C ++标准要求:如果遵循规则,它就可以工作。

如果不遵守规则,C ++实现可能会以看似不一致的方式破解。