为什么C++对整型常量的指针用const_cast并修改值后,出现了两个不一样的值?

#include <iostream>
#include <string>
#include <cstring>
using namespace std;

int main()
{
    const int a = 10;
    cout << "&a = " << &a << endl; // 0x7fffffffdf24
    const int *ptr = &a;
    cout << "*ptr = " << *ptr << endl; // *ptr = 10
    cout << "ptr = " << ptr << endl;   // ptr = 0x7fffffffdf24
    // *ptr2 = 20;  //错误
    int *ptr2 = const_cast<int *>(ptr);
    cout << "ptr2 = " << ptr2 << endl; // ptr2 = 0x7fffffffdf24
    *ptr2 = 20;
    cout << "a = " << a << endl;         // a = 10
    cout << "*ptr = " << *ptr << endl;   // *ptr = 20
    cout << "*ptr2 = " << *ptr2 << endl; // *ptr2 = 20
    cout << "&a = " << &a << endl;       //&a = 0x7fffffffdf24
    return 0;
}

平台:ubuntu20.04
编译器:gcc9

【以下回答由 GPT 生成】

我可以解答你的问题。

在C++中,const关键字用于声明一个只读的变量或指针。这意味着,一旦变量或指针被声明为const,它们的值就不能被修改。

然而,通过使用const_cast,我们可以将一个const指针转换为非const指针。这种转换通常是不安全的,因为它会绕开C++的类型系统。

在你的代码中,你通过const_castptr转换为非const指针ptr2。然后,你通过*ptr2 = 20修改了ptr2指向的值。

这导致了不一致的行为,因为你实际上修改了一个被声明为const的变量的值。C++并没有提供一种安全的机制来阻止这种类型的转换和修改。

这种行为是未定义的行为,意味着它可能在不同的编译器和环境中产生不同的结果。在你的例子中,a*ptr的值发生了变化,而ptr的值没有变化。

如果你想修改一个常量指针所指向的值,可以考虑使用非常量指针来避免未定义行为。或者,如果你真的需要修改一个常量指针所指向的值,你可以考虑重新设计你的代码,以避免使用const关键字。

因此,你的问题的答案是:通过使用const_cast修改整型常量指针的值后,出现了两个不一样的值是因为这种行为是未定义的,不建议这样做。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^