c++ 编译器是否保护常量内存地址不受任何更改?

Kha*_*led 2 c++ pointers constants

我想证明没有什么是(受保护的内存地址),整个故事只是关于编译器、操作系统或托管应用程序运行的任何应用程序,只需对托管的读写请求进行一些检查应用程序发送到它的上级进程,这个上级应用程序或你称之为什么决定这个子进程是否有权读取或写入这个特定的内存位置,但是这个 C++ 代码在本质上不起作用,为什么:

#include <iostream>
int main()
{
    const int x = 10;
    std::cout << &x << std::endl; // So i can view address of x
    std::cout << "x Before is equal "<< x <<std::endl;

    int y ;
    std:: cin >> std::hex >>y;

    int *pinter = (int*)y ;
    *pinter = 20;
    std::cout << "x After is equal "<< x <<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这段代码应该绕过 c++ 编译器将 x 变量类型设置为const int的概念,这样指向变量的指针(不像在 C 中,指向常量的指针可以改变 constant 的值)和对变量的引用都不能改变变量所以这段代码应该得到变量 x 的地址(当然在它打印出来之后)然后一个指针完成剩下的工作,所以我在这里搞砸了,因为它看起来像这个内存位置是硬件保护的(我知道不是,但我很困惑)

for*_*818 7

这段代码应该绕过 c++ 编译器将 x 变量类型设置为 const int 的概念,以便 [...]

您可以违反语言规则,但是您的代码不是有效的 C++。您不得修改符合const. 如果你这样做,你有未定义的行为。由于编译器被用来编译有效的 C++,它们没有被强制要求对无效代码做任何有意义的事情,结果可以是任何东西也可以什么都没有。

正如评论中已经说过的:

const与硬件或内存无关。这是您和您的编译器之间的协议,而您违反了该协议。作为奖励,你的编译器会对你的代码做任何事情,但不一定是你期望的。

您试图通过在运行时进行修改来欺骗编译器,以便在编译时编译器无法知道您将修改const. 但是,您确实声明xconst编译器将假定其值不会更改。如果你仍然修改值,x任何事情都可能发生。

PS:人们经常想出一些黑客来“证明”那些private不是真正私密的,cosnt不是真正const相似的。问题是:这些工具应该可以帮助您减少错误并编写更清晰的代码。如果您努力尝试绕过这些设施,您将设法这样做(有时甚至无需调用 UB)。然而,这“证明”除了有可能射中自己的脚之外什么都没有。C++ 不是 Java,它不会牵着你的手,并试图防止你犯下每一个可能的错误。在这方面,C++ 更接近 Python,“我们都是成年人”。