通过非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)

该程序将编译但显示未定义的行为,可能输出910或其他东西或可能崩溃谁知道。

当你说aconst ,你保证你不会尝试直接或间接地改变a的值,编译器可能做出某些假设。 如果你违背承诺意外事情可能会发生。

const关键字用于不更改变量的值。 如果强行完成结果可能会出乎意料