繁体   English   中英

通过指针更改const的值

[英]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的变量的值时的行为未定义。 编译器不必做任何有意义的事情。

在这种情况下,编译器在打印consti时不会费心去看内存,因为它知道该值不可能被任何符合条件的代码更改。 当您打印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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM