通过非常量指针修改常量:深入研究未定义的行为
在提供的代码片段中,您表达了对该行为的困惑通过非常量指针修改常量整数 (e) (w):
const int e = 2;
int* w = (int*) &e; // Casting to remove const-ness
*w = 5; // Modifying the value pointed to by w
所指向的值进行此修改后,您会观察到:
您进一步注意到 w 与 e 的地址相同 (cout cout w 进行了修改,但 e 如何保持不变。
此行为源于通过非修改常量时出现的未定义行为。 -常量指针。一旦进行此类修改,代码就会进入未定义的行为区域,该区域变得不可预测并取决于具体的实现细节。
在这种情况下,通过 w 进行的修改似乎会影响e 在运行时的临时副本,而原始 e 保持不变。原因是 e 被视为编译时常量,并且其值被硬编码到二进制代码中。因此,对 w 的任何运行时修改都不会影响原始的 e。
此行为特定于所使用的实现,不应依赖。通过非常量指针修改常量数据被认为是一种不好的做法,应该避免。正确的方法是使用非常量引用或创建要修改的数据的非常量副本。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3