我有2条应该相同的C ++代码

时间:2019-06-10 19:06:12

标签: c++ pointers const

这是第一段代码,输出44:

const int a[] = {3};
int* b = (int*)&a[0];
*b = 4;
cout << a[0] << *b;

这是第二个,输出34:

const int a = 3;
int* b = (int*)&a;
*b = 4;
cout << a << *b;

我没有想法,为什么会有区别。你们能解释一下吗?

2 个答案:

答案 0 :(得分:2)

指向声明为const的变量的指针只能分配给也声明为const的指针。您正在违反规则,理想情况下,编译器应阻止这样做。

gccclangMSVC中的任何一个都不能防止这样的错误,并且正如注释中所提到的,您具有未定义的行为,而不是至少一个警告。但是zapcc编译器会使您的程序因Segmentation fault而崩溃。

答案 1 :(得分:1)

除了通过使用强制转换来绕过编译器检查以更改const变量的值来调用“未定义行为”之外,观察到的结果还可以通过编译器可能进行的优化来解释:

在第一种情况下,您声明一个常量 array ,它很可能最终以RAM中某处的数据的形式结束。

在第二种情况下,您只有一个标量const值,编译器可能决定只使用常量的 value ,该常量在编译时在输出中是已知的,而不是从a中读取该已知值。 RAM位置。此优化也称为constant propagation。 如果您未在代码中使用a的地址,则该值甚至可能不会在数据RAM中分配位置。