用指针改变const的值

时间:2017-03-15 18:16:11

标签: c++ c const constants

answer this question解释了如何通过取消引用指向其地址的指针来更改常量变量(显然是通过创建新变量)。

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

2 个答案:

答案 0 :(得分:6)

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

在这种情况下,编译器在打印consti时无需查看内存,因为它知道任何值都不可能被任何值更改符合规范。当您打印i时,它会生成此程序集:

mov     esi, 10
mov     rdi, rax
call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)

请注意,它只是在该通话中硬编码10

答案 1 :(得分:3)

正如原始答案指出的那样:

  

它&#34;未定义的行为&#34;,这意味着根据标准,您无法预测尝试此操作时会发生什么。根据特定的机器,编译器和程序状态,它可能会执行不同的操作。

任何东西都是公平的游戏,包括你观察到的东西,这可能只是编译器优化的结果。你不应该花很多时间试图解释未定义的行为。

编辑:要更清楚地了解建议:不要这样做