【发布时间】:2022-01-05 13:13:58
【问题描述】:
所有。我从一本书中读到了一段代码 sn-p,作者试图通过直接内存访问来设置寄存器的值(他模拟了这个过程)。为此,他使用了 reinterpret_cast
int main()
{
const std::uint8_t a = 5;
const std::uintptr_t address = reinterpret_cast<std::uintptr_t>(&a);
*reinterpret_cast<volatile uint8_t*>(address) = 10;
std::cout << unsigned(a) << std::endl;
return 0;
}
所以,我的目的是通过直接内存访问来更改常量变量的值。我已经在 Visual Studio C++ 2019 中编写了这段代码并编译并运行了它。没有任何错误或警告,但输出非常有趣。 a 的值打印为 5。因此,我切换到调试模式,以便在每个步骤中查看发生了什么。我将在下面插入图片:
很抱歉将调试输出包含为图像,但我认为包含图像会更好,所以我不会错过任何重要的细节。对我来说有趣的是,程序输出是 5,而调试器清楚地表明 a 的值是 10? (我什至打印了 reinterpret_cast 之前和之后的地址,它们是一样的。)非常感谢。
【问题讨论】:
-
您不能更改
const变量的值,句号。尝试这样做会调用未定义的行为,然后任何事情都可能发生。 -
未定义的行为会做什么,K$n_WCg3dZ"iQ.FR
-
了解什么是 Undefined Behavior 是学习 C++ 的重要一步。观察具有未定义行为的程序的结果,比如这个,不会教你任何关于语言的知识。
-
除了未定义的行为。使用
const std::uint8_t a = 5;,您说a是const 并保存值5。由于编译器可以将std::cout << unsigned(a) << std::endl;优化为std::cout << unsigned(5) << std::endl;,因为它假定a永远不会改变。 -
我有一个问题,有人努力使某些东西成为 const (可能是为了确保一些设计约束)。你为什么要把它扔掉?如果你真的需要一个非常量变量,你可以将数据复制到一个非常量变量中并使用它。
标签: c++ constants reinterpret-cast