非const int指针在const int上的行为

sbo*_*ose 1 pointers

#include<stdio.h>

int main()
{
       const int sum=100;
        int *p=(int *)&sum;

        *p=101; 


        printf("%d, %d",*p,sum);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

/*

产量

101,101

*/

p指向一个常数整数变量,那么为什么/ p如何设法改变sum的值?

Mic*_*urr 6

这是未定义的行为 - 这是代码中的错误.代码"似乎有效"这一事实毫无意义.允许编译器使程序崩溃,或者允许程序执行无意义的操作(例如更改应该是const的某些内容的值).或者完全做其他事情.对行为进行"推理"是没有意义的,因为对行为没有要求.

请注意,如果代码编译为C++,您将收到错误,因为C++不会被隐式抛弃const.希望,即使编译为C,您也会收到警告.

  • 注意:当我评论C++不能编译它时,(int*)强制转换不在代码中.该转换使代码编译为C++,但`*p = 101;`表达式仍然是未定义的行为.你有一些对你有意义的事实仍然无关紧要. (2认同)
  • ISO/IEC 9899:1999 6.3.7/5`如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为未定义. (2认同)