【问题标题】:Does uninitialized pointer evaluate to true, false, or results in undefined behavior? [duplicate]未初始化的指针是否评估为真、假或导致未定义的行为? [复制]
【发布时间】:2018-01-27 07:49:29
【问题描述】:

我在 C 标准中找不到,如果未初始化的指针评估为真、假,或者导致未定义或实现定义的行为?例如:

{
    int *p;
    if (p)
     do_sth();

}

【问题讨论】:

  • 当然是 UB。
  • 上下文很重要!如果指针是在函数内部定义的(因为下一条语句似乎是 if 测试它),结果是未定义的行为。如果指针在任何函数之外定义,则默认初始化为空指针并比较为假。
  • 如果它在函数中并且已经获取了它的地址,它可能驻留在内存中并且它的内容是不确定的,并且值可以在任何使用实例中改变,但它的行为就像它是真的一样或在任何给定时刻为假。
  • 有人可以指出 C 标准中的具体部分吗?我找不到它。不,这不是一个重复的问题。

标签: c pointers initialization undefined-behavior


【解决方案1】:

在您的示例代码中未定义行为访问 C 中的任何未初始化值,无论其类型如何(unsigned char 除外)。

由于指针不是unsigned char 类型,因此行为未定义。

隐式初始化的注意事项,例如将定义放在文件范围内,或使用static 存储类说明符定义它,会导致对象默认为零初始化。

欲了解更多信息,请参阅(Why) is using an uninitialized variable undefined behavior?

【讨论】:

  • 没那么简单
  • @AnttiHaapala 我明白你的意思。
  • 未指定从访问未初始化的unsigned char 获得的值,即使访问不会导致未定义的行为。在文件范围内(或在具有存储类 static 的函数内)定义的 unsigned char 被初始化为 0。
  • @JonathanLeffler 你的评论比我对那些缺失点的认识要慢:)
  • 这就是不使用 copy'n'paste 重复自己的结果:D
猜你喜欢
  • 2013-08-12
  • 1970-01-01
  • 2018-11-05
  • 2015-04-19
  • 1970-01-01
  • 2013-01-21
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多