在C++中尝试破解常量时的奇怪行为

Luk*_* Vo 1 c++ memory pointers

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

我正在学习C++,对指针非常有趣.而我试图改变一个恒定值的值(我的老师叫它backdoor,请澄清我是不是错了)像这样:

const int i = 0;

const int* pi = &i;

int hackingAddress = (int)pi;
int *hackingPointer = (int*)pi;

*hackingPointer = 1;

cout << "Address:\t" << &i << "\t" << hackingPointer << endl;
cout << "Value:  \t" << i << "\t\t" << *hackingPointer << endl;

system("PAUSE");

return 0;
Run Code Online (Sandbox Code Playgroud)

但是,结果很奇怪.虽然两个地址相同,但值不同.

我的代码是如何执行的?哪里01价值准确存储?

jal*_*alf 11

您已经发现C++开发人员称之为未定义行为的小事.你告诉编译器" i是一个值为0的常量".因此,当您向编译器询问其值时i,它会告诉您它为0.

尝试更改常量的值时,错过了编译器的假设(常量将是,常量),因此,编译器将生成无效或不一致的代码.

在C++中有很多情况可以在没有编译器将其作为错误捕获的情况下执行某些操作,但结果是未定义的.如果你这样做,那么你得到的结果就像你所看到的那样.编译器做了一些奇怪和意外的事情.

哦,如果你的老师试图通过这样的例子教你什么,那他就错了,你应该非常害怕.

你从这样的代码得到的唯一保证是这样的:

编译器可以完全按照自己喜欢的方式执行

编写代码时,您与编译器有一个隐式契约:

"如果我编写定义良好的C++代码,那么就将其转换为具有与C++标准所描述的效果相同的可执行文件".

当你做这样的事情时,你违反了合同.然后编译器也没有义务遵循它.如果你给编译器代码根据C++标准没有很好地定义,那么它就不能,也不会创建一个像C++标准那样的可执行文件.