【问题标题】:can casting away constness lead to undefined behavior? [duplicate]抛弃 constness 会导致未定义的行为吗? [复制]
【发布时间】:2013-08-02 06:24:47
【问题描述】:
const int a = 10
int *p = (int*) &a;
*p = 20;
printf("a = %d", a);

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

【问题讨论】:

标签: c casting constants


【解决方案1】:

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

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

【讨论】:

  • + for constraint violation 称为 const-constraint - 我喜欢正确的术语。
  • @GrijeshChauhan 无关:感谢您提供的欺骗链接。
  • @H2CO3 我已经多次阅读这些答案。我过去也有同样的困惑。实际上问题是一个很好且显而易见的问题。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这是未定义的行为:

    C11 6.7.3 类型限定符

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

    【讨论】:

      【解决方案4】:

      是的,这是未定义的行为,我认为这就是它的所在。

      C99 第 6.7.3 节第 5 段

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-11
          • 2016-09-04
          • 1970-01-01
          • 2012-09-28
          • 1970-01-01
          • 2013-04-24
          • 1970-01-01
          • 2016-02-17
          相关资源
          最近更新 更多