运行以下代码显示& 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
答案 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 ++实现可能会以看似不一致的方式破解。