C ++从const int *转换为int *处理意外结果

时间:2016-06-25 08:47:17

标签: c++ pointers type-conversion const

在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。

4 个答案:

答案 0 :(得分:6)

在C ++中,对象是const,或者不是。如果它是const而不是任何修改它的尝试将调用未定义的行为。那就是你做的。此时任何都可能发生。如果你很幸运,它会崩溃。如果你不那么幸运,它会正常工作,直到你的代码在客户手中,它会造成最大的损害。

您可以在C ++中轻松地将const int *转换为int *。你做的就是。但是,“const int *”和“int *”并不意味着指向的东西是const。它只是意味着编译器不允许您在一种情况下进行分配,并允许您在另一种情况下进行分配。 *c1const。将指针强制转换为int*并不会改变它为const的事实。未定义的行为。

答案 1 :(得分:2)

它未定义的行为。

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

永远不要依赖于此。它可以很容易地对你的猫进行纹身。

答案 2 :(得分:1)

const int变量将占用堆栈中的内存,但编译器只会将a1的所有实例替换为40。表达式&a1将不会被替换,以及魔法以某种方式指向堆栈上的内存。更改内容时,内存中的内容将更改,但这些常量40不会更改。因此它们的产量不同。

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

答案 3 :(得分:0)

运行它,也许有帮助。

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;