[英]Changing value of const by pointer
这个答案在这个问题介绍了如何通过非关联化的指针,它的地址作品(显然是通过创建一个新的变量)改变一个常数变量。
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
我想用&*(int *)&i
来获取先前答案所讨论的新变量的地址。 如何找到此新变量的存储位置?
*(int *)&i
显示不同的值,因此必须有一个新变量。
在g ++ 5.4.0,Ubuntu 16.04上编译
更改声明为const
的变量的值时的行为未定义。 编译器不必做任何有意义的事情。
在这种情况下,编译器在打印const
值i
时不会费心去看内存,因为它知道该值不可能被任何符合条件的代码更改。 当您打印i
,它将生成以下程序集:
mov esi, 10
mov rdi, rax
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
注意,它只是在该调用中硬编码10
。
正如原始答案正确指出的那样:
这是“未定义的行为”,这意味着基于标准,您无法预测尝试该操作时将发生的情况。 根据特定的计算机,编译器和程序状态,它可能会做不同的事情。
任何事情都是公平的,包括您观察到的情况,这可能只是编译器优化的结果。 您不应该花太多时间尝试解释未定义的行为。
编辑:要更清楚地建议: 不要这样做 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.