可以抛弃constness导致未定义的行为?

时间:2013-08-02 06:24:48

标签: c casting const

const int a = 10
int *p = (int*) &a;
*p = 20;
printf("a = %d", a);

是否可以输出10或20,具体取决于编译器?

5 个答案:

答案 0 :(得分:15)

  

是否可以输出10或20,具体取决于编译器?

是的,甚至可以出现鼻恶魔。该程序的行为未定义,代码格式错误,因为修改const对象是违反约束的行为。

答案 1 :(得分:11)

如上所述,您的代码具有未定义的行为,所以是的,您可以获得10或20或其他任何内容(例如,访问冲突)。

答案 2 :(得分:6)

这是未定义的行为:

C11 6.7.3类型限定符

  

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

答案 3 :(得分:6)

是的,它是未定义的行为,我认为这就是告诉它的地方。

C99第6.7.3节第5段

  

如果尝试修改用a定义的对象   通过使用具有非const限定的左值的const限定类型   类型,行为未定义。如果试图引用一个   通过使用左值使用volatile限定类型定义的对象   对于非volatile限定类型,行为是未定义的.15)

答案 4 :(得分:3)

执行*p=20时,您试图更改常量的值,这是不允许的。