为了账号安全,请及时绑定邮箱和手机立即绑定

内存地址相同的两个不同的值

内存地址相同的两个不同的值

C++
慕莱坞森 2019-07-03 10:38:34
内存地址相同的两个不同的值电码#include <iostream>using namespace std;int main() {     const int N = 22;     int * pN = const_cast<int*>(&N);     *pN = 33;     cout << N << '\t' << &N << endl;     cout << *pN << '\t' << pN << endl;}输出量22 0x22ff7433 0x22ff74为什么同一地址有两个不同的值?
查看完整描述

3 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

为什么同一地址有两个不同的数据?

没有,编译器可以优化对Const的任何提及,就像您已经在其中编写了它的编译时值一样。

注意,编译器还可以生成代码,以便在运行硬盘时擦除硬盘,如果您做了一些令人讨厌的操作,比如将内存写入为Const保留的内存。


查看完整回答
反对 回复 2019-07-03
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

您会在行中得到未定义的行为。*pN = 33;,因为您正在修改Const值。任何事都可能发生。别这么做。


不过,您的编译器可能只是简单地进行了优化。在队伍中:

cout << N << '\t' << &N << endl;

它知道N是一个值为22的常量表达式,因此只需将该行更改为:

cout << 22 << '\t' << &N << endl;

在下一行中,在N,你“设定”为33。(但实际上,您所做的只是删除了对程序状态的任何保证。)


查看完整回答
反对 回复 2019-07-03
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

通过声明N康斯特,你答应过不会修改它的。然后你去修改它。这打破了编译器所做的假设之一,因此程序的行为不正确。

这被称为“未定义的行为”-在违反了语言中的假设之后,程序的行为是完全地没有定义。它不需要产生那样的产出-它可以产生33对双方来说,或42,或者撞坏,或者擦除你的硬盘,或者通过你的鼻腔召唤恶魔。所以,不要修改Const值:)


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 575 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信