猿问

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

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

电码

#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 0x22ff74

33 0x22ff74

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


慕莱坞森
浏览 576回答 3
3回答

喵喔喔

为什么同一地址有两个不同的数据?没有,编译器可以优化对Const的任何提及,就像您已经在其中编写了它的编译时值一样。注意,编译器还可以生成代码,以便在运行硬盘时擦除硬盘,如果您做了一些令人讨厌的操作,比如将内存写入为Const保留的内存。

缥缈止盈

您会在行中得到未定义的行为。*pN = 33;,因为您正在修改Const值。任何事都可能发生。别这么做。不过,您的编译器可能只是简单地进行了优化。在队伍中:cout&nbsp;<<&nbsp;N&nbsp;<<&nbsp;'\t'&nbsp;<<&nbsp;&N&nbsp;<<&nbsp;endl;它知道N是一个值为22的常量表达式,因此只需将该行更改为:cout&nbsp;<<&nbsp;22&nbsp;<<&nbsp;'\t'&nbsp;<<&nbsp;&N&nbsp;<<&nbsp;endl;在下一行中,在N,你“设定”为33。(但实际上,您所做的只是删除了对程序状态的任何保证。)

qq_花开花谢_0

通过声明N康斯特,你答应过不会修改它的。然后你去修改它。这打破了编译器所做的假设之一,因此程序的行为不正确。这被称为“未定义的行为”-在违反了语言中的假设之后,程序的行为是完全地没有定义。它不需要产生那样的产出-它可以产生33对双方来说,或42,或者撞坏,或者擦除你的硬盘,或者通过你的鼻腔召唤恶魔。所以,不要修改Const值:)
随时随地看视频慕课网APP
我要回答