c++从const int*到int*的转换,处理意外结果

C++ Conversion from const int* to int* working with unexpected results

本文关键字:int 处理 结果 转换 意外 const c++      更新时间:2023-10-16

在c++中,我们知道不能将const int*转换为int*。但是我有一个代码片段,我可以把const int*转换成int*。我是c++的初学者,我在谷歌上搜索了这个,但我只是得到了提到const int*不能转换为int*以避免const违反的链接。我不明白为什么它编译没有错误

#include <iostream>
using namespace std;
int main(void)
{
    const int a1 = 40;
    const int* b1 = &a1;
    int* c1 = (int *)(b1);
    *c1 = 43;
    cout<< c1<<" "<< &a1<<endl;
    cout<< *c1<<" "<< a1<<endl;
 }

同样,问题是上面程序的输出是:

0x7fff5476db8c 0x7fff5476db8c
43 40

有人可以解释c1整数指针是指向相同的地址a1,但有不同的值43和40分别

在c++中,对象是const还是非const。如果它是const,那么任何修改它的尝试都将调用未定义行为。你就是这么做的。在那个点任何都可能发生。如果你幸运的话,它会崩溃。如果不那么幸运,它也可以正常工作,直到您的代码交到客户手中,并可能造成最大的损害。

在c++中,可以很容易地将const int*类型转换为int*类型。你刚才说了。然而,"const int*"answers"int*"并不意味着指向的对象是否是const。它只是意味着编译器不允许你在一种情况下赋值,而允许你在另一种情况下赋值。*c1const。将指针指向int*不会改变它是const的事实。未定义的行为。

这是未定义的行为。

但是,在这种情况下发生的事情是编译器已经意识到它可以用实际值40替换cout语句中的a1,因为它意味着const

千万不要依赖这个。它很容易纹在你的猫身上。

const int变量将占用堆栈内存,但编译器将简单地将a1的所有实例替换为40。表达式&a1不会被替换,以及如何神奇地指向堆栈上的内存。当您更改内容时,内存中的内容将被更改,但这些常量40不会更改。因此它们的输出不同。

这只是未定义的行为,可能因编译器而异。一个编译器可能会显示43,另一个编译器可能总是显示40,还有一些编译器可能会生成代码导致崩溃(写入只读内存)。别这么做!

运行这个,也许会有帮助。

const int a1 = 40;
std::cout<<"__________ const int a1 = 40; ____________________________________"<<std::endl;
std::cout<<"a1: "<< a1<<std::endl;
std::cout <<"&a1 "<< &a1<<std::endl;
std::cout <<"*a1: INVALID"<<std::endl;
const int* b1 = &a1;
std::cout<<"__________ const int* b1 = &a1; ____________________________________"<<std::endl;
std::cout<<"b1: "<< b1<<std::endl;
std::cout <<"&b1 "<< &b1<<std::endl;
std::cout <<"*b1 "<< *b1<<std::endl;
int* c1 = (int *)(b1);
std::cout<<"__________ int* c1 = (int *)(b1); ____________________________________"<<std::endl;
std::cout<<"c1: "<< c1<<std::endl;
std::cout <<"&c1 "<< &c1<<std::endl;
std::cout <<"*c1 "<< *c1<<std::endl;
*c1 = 43;
std::cout<<"__________ *c1 = 43; ____________________________________"<<std::endl;
std::cout<<"c1: "<< c1<<std::endl;
std::cout <<"&c1 "<< &c1<<std::endl;
std::cout <<"*c1 "<< *c1<<std::endl;
std::cout<<"c1: "<< c1<<std::endl;
std::cout<<"*c1: "<< *c1<<" -----> *&a1: "<< *&a1<<" - a1: "<< a1<<std::endl;
std::cout<<"&c1: "<< &c1<<std::endl;