这是第一段代码,输出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;
我没有想法,为什么会有区别。你们能解释一下吗?
答案 0 :(得分:2)
指向声明为const
的变量的指针只能分配给也声明为const
的指针。您正在违反规则,理想情况下,编译器应阻止这样做。
gcc
,clang
和MSVC
中的任何一个都不能防止这样的错误,并且正如注释中所提到的,您具有未定义的行为,而不是至少一个警告。但是zapcc
编译器会使您的程序因Segmentation fault
而崩溃。
答案 1 :(得分:1)
除了通过使用强制转换来绕过编译器检查以更改const
变量的值来调用“未定义行为”之外,观察到的结果还可以通过编译器可能进行的优化来解释:
在第一种情况下,您声明一个常量 array ,它很可能最终以RAM中某处的数据的形式结束。
在第二种情况下,您只有一个标量const值,编译器可能决定只使用常量的 value ,该常量在编译时在输出中是已知的,而不是从a中读取该已知值。 RAM位置。此优化也称为constant propagation。
如果您未在代码中使用a
的地址,则该值甚至可能不会在数据RAM中分配位置。