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

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

4

5 回答 5

15

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

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

于 2013-08-02T06:28:45.103 回答
11

正如它所写的那样,您的代码具有未定义的行为,所以是的,您可能会得到 10 或 20 或其他任何值(例如,访问冲突)。

于 2013-08-02T06:28:56.710 回答
6

这是未定义的行为:

C11 6.7.3 类型限定符

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

于 2013-08-02T06:30:25.730 回答
6

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

C99 第 6.7.3 节第 5 段

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

于 2013-08-02T06:30:43.767 回答
3

当你这样做时*p=20,你试图改变一个常量的值,这是不允许的。

于 2013-08-02T06:26:49.290 回答