当前位置: 首页 > 知识库问答 >
问题:

这是否访问了一个假设的数组元素肯定是UB?

姜胤
2023-03-14
int arr[2];
int b = arr[2];

根据 [执行子 #1]

表达式E1[E2](根据定义)与*((E1)(E2))相同,但对于数组操作数,如果该操作数是左值,则结果是左值;否则结果是xvalue。

其中 (E1) (E2) 由 [expr.add#4.2] 确定

将具有整数类型的表达式 J 添加到指针类型的表达式 P 中或从中减去该表达式 J 时,结果的类型为 P。

  • […]
  • 否则,如果P指向具有n个元素的数组对象x的数组元素i([dcl.array]),则表达式P J和J P(其中J的值为J)指向x的(可能是假设的)数组元素ij,如果为0≤ i j(i j)≤ n和表达式P-J指向(可能是假设的)x的数组元素i-J,如果为0≤ i-j≤ n
  • 否则,行为是未定义

在本例中,arr 2指向假设的数组元素,这里没有UB。*(arr 2)的结果是一个glvalue,它引用了arr 2intb=arr[2]定义良好。另一种解释是,根据[basic.lval#11],该存储中没有对象或其他类型的对象

如果程序试图通过类型与以下类型之一不相似的glvalue访问对象的存储值,则行为未定义:

  • 对象的动态类型,
  • 与对象的动态类型对应的有符号或无符号类型的类型,或
  • […]

在本例中,该示例被判断为 UB。所以,我想知道这个例子肯定是UB还是与我分析的相同(即,一个未指定的案例)?

共有1个答案

蒙奇
2023-03-14

在这个例子中,arr 2指向假设的数组元素,这里没有UB。*(arr 2)的结果是一个glvalue,它引用了arr 2指向的对象。

你在这里跳过了一步。假设的数组元素是假设的。这意味着它实际上并不存在。但在下一句话中,你说的是“arr2指向的对象”。该地址没有对象。

您引用的[basic.lval#11]中的一点是关于别名的,即对象确实存在的地方。它不适用于假设对象。

为了澄清你评论中的一个误解,应该注意的是,在C语言中,内存可以在该地址不存在对象的情况下存在。放置new的全部目的是在内存中创建一个以前不存在的对象。所以你不能假设在arr 2处一定有某种对象。

 类似资料:
  • 换句话说,以下行是否保证打印行数? 这个问题是由https://stackoverflow.com/a/41346586/2513200 我模模糊糊地记得有一次讨论,认为避免迭代的优化可能是合法的,但在快速搜索过程中没有发现任何结论。 流的JavaDocs。count包含以下语句: 这是还原的特殊情况,相当于:

  • 问题内容: 我的问题: 我有一个很大的JSON文件的数据集。我阅读并将其存储在变量中。 接下来,我对其进行预处理-以便能够使用它。 完成后,我便开始分类: 我使用交叉验证方法以获得平均准确度并训练分类器。 我进行了预测,并获得了该折痕的准确性和混乱度矩阵。 在此之后,我想获得的,,和值。我将使用这些参数来获得 敏感性 和 特异性 。 最后,我将使用它来放入HTML,以显示带有每个标签TP的图表。

  • 问题内容: 我有两个数组,我想检查是否每个元素都在中。如果元素的值在中重复,则该元素的值必须相等。最好的方法是什么? 问题答案: 一种选择是对两个数组进行排序,然后遍历两个数组,然后比较元素。如果在超级袋中未找到子袋候选中的元素,则前者不是子袋。排序通常为O(n *log(n)),比较为O(max(s,t)),其中 s 和_t_是数组大小,总时间复杂度为O(m * log(m)) ,其中m =ma

  • 问题内容: 我在PHP中有两个数组,如下所示: 人: 通缉犯: 如何检查是否 所有 的的 人们 元素是在 通缉犯 阵列? 在此示例中,它应该返回,因为在 通缉犯中 。 问题答案: 您可以使用。

  • 假设我有两个数组,和,其中是的子集: 我想返回如下数组: 如果只是一个数字,那就足够简单了(),但我尝试了y中的等效

  • 问题内容: 我试图遍历2个数组,外部数组则比另一个数组更长。它将循环遍历第一个,如果第二个数组不包含该int,它将返回false。但是我不知道该怎么做。这是我到目前为止所拥有的: 运行时出现此错误: 我想知道是否可以不使用嵌套循环(如上)来完成。我知道我做错了,如果有人可以在此问题上提供帮助,那就太好了。我也不确定要在Java文档中寻找什么类。 问题答案: 您可以检查较大的数组是否包含较小数组中的