在cpp中创建一个变量const然后将其地址提供给一个指针,但取消引用不会改变变量,为什么?

在 cpp 中创建一个变量 const 然后将它的地址提供给一个指针并通过取消引用来更改它的值,但我仍然得到我最初存储的值。

代码片段

const int a = 5;
    // then
    // a = 7; not possible
    // bypassing const using pointers
    int *ap = (int *)&a;
    *ap = 10;

    cout << *ap <<" "<< *(&a)<<" " << a << endl;

输出是:

10 10 5

回答

任何修改声明的变量或成员的程序const都具有不再由 C++ 标准定义的行为。

这被称为UB。UB 的常见症状是崩溃、“它似乎可以工作”、奇怪的不一致状态,甚至时间旅行,其中未来的 UB在代码中发生之前改变行为。

一个好的 C++ 程序员的习惯使 UB 不太可能。

您在此处看到的 UB 的症状是,由于 C++ 标准指定的行为没有任何程序const int x=5;可以具有除 之外的任何值5,因此编译器将 read to 替换x为常量5

另一方面,您可以形成一个指向 的指针x,并且x那里确实有字节。编译器可以自由地放入xROM 或受保护的页面,或者它可以不打扰并将其放入普通内存中。

你形成一个指向x. 编译器不会忽略此指针(允许,但也不允许),因此在您的机器代码中,它实际上会读取和写入x存储地址处的数据。因此*&x10同时X is5 . What more, *&X could be5`如果编译器优化指针程。

避免UB。

C++ 定义了一个抽象机器,C++ 程序在它上面定义了行为(除非你做 UB)。然后将其转换为保证与抽象机器行为一致的机器代码,但根本无法保证天真地看起来“应该”映射到某些机器代码的 C++ 代码确实如此。

抽象和具体之间的差距允许进行大量优化。

C++ 抽象机器行为旨在轻松映射到机器代码,而 UB 则留在执行某些行为会产生成本的地方。


以上是在cpp中创建一个变量const然后将其地址提供给一个指针,但取消引用不会改变变量,为什么?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>