C++ 为什么我的代码覆盖了 const int x = *(&y);工作?

C++ Why does my code for overwriting const int x = *(&y); work?

为什么我的覆盖 const int 变量的代码有效?安全吗?

#include <iostream>
#include <cstring>

using namespace std;

int z = 5;
const int x = *(&z);

int main()
{
    cout << "A:" << x << ", " << &x << endl;
    int y = 7;
    cout << "B:" << y << ", " << &y << endl;
    memcpy((int*)&x, &y, sizeof(int));
    cout << "C:" << x << ", " << &x << endl;
}

输出将是:

A:5, 0x600f94
B:7, 0x7a7efb68019c
C:7, 0x600f94

我不确定以前是否有人问过这个问题,因为我不知道在这种情况下要搜索什么。

回答您的问题:

  1. 不安全;永远不应该这样做,这是 如何不使用 C.

  2. 的示例
  3. 它基于未定义的行为;这意味着规范没有给出如何在代码中处理此类尝试的确切说明。

  4. 问题为什么有效?这里的答案仅适用于 GCC,因为其他编译器可能 optimise/treat const 的方式不同。您需要了解,从技术上讲,const int x 是带有限定符的变量声明。这意味着(在优化之前)它位于内存中(在某些情况下位于 read-only 部分)。当您删除限定符并将变量的地址提供给 memcpy() (这是不知道内存保护的虚拟库调用)时,它会尝试将新数据写入该地址。如果编译器将该变量放入 read-only 部分(我过去遇到过那个史诗般的失败),那么在任何 Unix 上的执行都会以 段错误 结束,这是由于写入指令违反内存保护引起的read-only 程序用来保存常量数据的内存段。

在 C++ 中,实常量由 constexpr 限定,但还有其他含义。