通过指针更改const的值

tab*_*ces 0 c c++ const constants

这个答案这个问题介绍了如何通过非关联化的指针,它的地址作品(显然是通过创建一个新的变量)改变一个常数变量.

const int i = 10;
*(int *)&i = 5;

std::cout << &i << "\t" << i << "\n";                   // 0x7fff6b325244   10

std::cout << &*(int *)&i << "\t" << *(int *)&i << "\n"; // 0x7fff6b325244   5
Run Code Online (Sandbox Code Playgroud)

随着&*(int *)&i我试图让以前的答案是谈论新的变量的地址.如何找到存储此新变量的位置?

*(int *)&i 显示不同的值,因此必须有一个新变量.

在g ++ 5.4.0,Ubuntu 16.04上编译

Mil*_*nek 6

更改声明的变量值时的行为const是未定义的.编译器不必做任何有意义的事情.

在这种情况下,编译器在打印const值时不会费心查看内存i,因为它知道任何符合规范的代码都不可能改变该值.打印时i,它会生成此程序集:

mov     esi, 10
mov     rdi, rax
call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
Run Code Online (Sandbox Code Playgroud)

请注意,它只是10在该呼叫中硬编码.