首页 > 解决方案 > c++ 编译器是否保护 const 内存地址不受任何更改?

问题描述

我想证明没有什么被称为(受保护的内存地址),整个故事只是关于编译器、操作系统或托管应用程序正在运行的任何应用程序,只需对托管的读写请求进行一些检查应用程序发送到它的上级进程,这个上级应用程序或你称之为的任何东西决定这个子进程是否有权读取或写入这个特定的内存位置,但是这个 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;
}

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

标签: c++pointersconstants

解决方案


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

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

正如评论中已经说过的:

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

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

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


推荐阅读