通过非const指针修改const int
#include int main(){ const int a = 10; *(int*)(&a) = 9; // modify a printf("%d", a); return 0; }
- 当我在Xcode上运行此代码时,输出为10(未更改)
- 当我在Visual Studio社区上运行此代码时,输出为9(已更改)
为什么?
问:为什么?
Ans: 未定义的行为 。
为了解释,如果你试图通过访问是通过一些non-const
指针来修改const
变量值,它会调用未定义的行为 。
根据C11
标准,第6.7.3章,第6段。
如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为未定义。
注意: main()
的推荐签名是int main(void)
。
该程序将编译但显示未定义的行为,可能输出9
或10
或其他东西或可能崩溃谁知道。
当你说a
是const
,你保证你不会尝试直接或间接地改变a的值,编译器可能做出某些假设。 如果你违背承诺意外事情可能会发生。
const关键字用于不更改变量的值。 如果强行完成结果可能会出乎意料