【问题标题】:In C++, is accessing an uninitialized array unspecified behavior or undefined behavior?在 C++ 中,访问未初始化的数组是未指定的行为还是未定义的行为?
【发布时间】:2018-09-16 17:15:39
【问题描述】:

例如在下面的代码中:

int myarray[3];
int x = myarray[1];

代码是否保证在恒定时间内成功执行,x 有一些整数值?或者编译器是否可以完全跳过为此发出代码/发出代码以启动 GNU Chess 并仍然符合 C++ 标准?

这在类似于数组的数据结构中很有用,但可以在恒定时间内初始化。 (抱歉,我的 Aho、Hopcroft 和 Ullman 手边没有我的副本,所以找不到名字。)

【问题讨论】:

  • 这是未定义的行为。:)
  • 你不能那样做。 C/C++ 中没有“垃圾”状态。这不是 SQL!一个对象要么有一个值,你可以通过任何程度的可预测性和定义性读取,要么没有。
  • @MartinC.Martin:你如何区分随机的“垃圾值”和有效值?
  • 问题是这是自动存储还是进程/线程存储?全局数组的默认初始化是零值初始化。

标签: c++ unspecified-behavior


【解决方案1】:

这是未定义的行为。

根据标准([dcl.init] 第 12 段),

如果没有为对象指定初始化程序,则该对象是默认初始化的。存储对象时 获得具有自动或动态存储持续时间的对象,该对象具有一个不确定值,并且如果 没有对对象执行初始化,该对象保留一个不确定的值,直到该值 被替换...如果一个不确定的值是由一个评估产生的,那么行为是不确定的,除了在 以下情况

在以下所有情况下,解决无符号窄字符类型或std::byte 的访问,这可能导致不确定值而不是未定义。

【讨论】:

  • 感谢您查看规范!我不确定我将如何解决这个问题,但也许有办法......
【解决方案2】:

访问任何个未初始化的数据是未定义的行为。

【讨论】:

  • 我不相信这适用于所有类型。见stackoverflow.com/a/11965368/2757035。 “未定义”和“未指定”之间的区别很重要。
  • @underscore_d 这是一道 C 题,这是一道 C++ version
  • @ShafikYaghmour 感谢您的细微差别。所以我的观点仍然存在:某些类型在最坏的情况下产生 indeterminate 值,而不是 undefined
  • @ShafikYaghmour:读取未初始化的unsigned char 仍然不是 C++ 中的 UB,是吗?
  • 除非完成其他一些事情,否则它仍然是未定义的......标准中的子句在产生未确定的结果时得到项目符号列表
猜你喜欢
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多