通过非const指针修改const int

dis*_*ute 0 c pointers const

#include <stdio.h>

int main(){
    const int a = 10;
    *(int*)(&a) = 9; // modify a
    printf("%d", a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  • 当我在Xcode上运行此代码时,输​​出为10(未更改)
  • 当我在Visual Studio社区上运行此代码时,输​​出为9(已更改)

为什么?

Moh*_*ain 8

该计划将编译,但表现出不确定的行为,并可以输出910或别的东西,或可能崩溃谁知道.

当你说aconst,你承诺你不会尝试a直接或间接地改变价值,编制者可能做出某些假设.如果你违背承诺意外事情可能会发生.


Sou*_*osh 5

问:为什么?

Ans:未定义的行为.

为了解释,如果您尝试const通过某个non-const指针访问来修改变量值,则会调用未定义的行为.

按照C11标准,第6.7.3章第6段.

如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为是未定义的.

注意:推荐的签名main()int main(void).