Dontla 2023-08-23 18:03 采纳率: 100%
浏览 5
已结题

为什么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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-23 20:49
    关注

    【以下回答由 GPT 生成】

    我可以解答你的问题。

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

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

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

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

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

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

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


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月31日
  • 已采纳回答 8月23日
  • 创建了问题 8月23日

悬赏问题

  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥15 python爬取bilibili校园招聘网站
  • ¥30 求解达问题(有红包)
  • ¥15 请解包一个pak文件
  • ¥15 不同系统编译兼容问题