![]() |
1
45
是的,这是合法的。从 C99 draft standard : §6.5.2.1第2段:
§6.5.3.2第3段(重点):
§6.5.6,第8段:
请注意,该标准明确允许指针指向数组末尾的一个元素,
前提是它们没有被取消引用
. 根据6.5.2.1和6.5.3.2,表达式
|
![]() |
2
41
您的示例是合法的,但这只是因为您没有实际使用越界指针。 让我们先来处理越界指针(因为我最初是这样解释您的问题的,在我注意到示例使用了一个超过结束指针的指针之前): 一般来说,你甚至不被允许这样做 . 没有别的地方。 指针甚至不允许存在,这意味着您显然也不允许取消引用它。 以下是标准对该主题的说明: 5.7:5:
(强调矿山) 当然,这是针对操作员+。因此,可以肯定的是,以下是标准对阵列订阅的说明: 5.2.1:1:
感谢ilproxyil在这里更正了最后一点,回答了您问题的最后一部分:
所以他们做的事情并不完全相同,尽管在这种情况下,最终结果是一样的。 |
![]() |
3
17
信息技术 是 合法的
According to the gcc documentation for C++
,
但是,即使指针指向有效地址,尝试取消对未分配内存的指针的引用仍然是未定义的行为。因此,即使指针本身是有效的,尝试取消引用该表达式生成的指针仍然是未定义的行为(即非法)。 但实际上,我认为这通常不会导致撞车。 编辑:顺便说一句,STL容器的end()迭代器通常是这样实现的(作为指向末尾的指针),这很好地证明了这种做法是合法的。 编辑:哦,现在我明白了,你并不是在问持有指向该地址的指针是否合法,而是问获取指针的确切方式是否合法。我会听从其他人的回答。 |
![]() |
4
10
232 具有以下特征:
虽然这是一个稍有不同的示例,但它确实显示了“*”不会导致左值到右值的转换,因此,假设表达式是“&”的直接操作数它期望一个左值,然后定义行为。 |
![]() |
5
9
我不认为这是违法的,但我确实相信&数组[5]未定义。
正如其他地方指出的那样,
|
![]() |
6
7
除了以上的答案,我还将指出操作员&可以为类重写。因此,即使它对pod有效,对您知道无效的对象也可能不是一个好主意(就像首先覆盖操作符&())。 |
![]() |
7
4
这是合法的:
因此,我们可以说array_end也是等价的:
上述内容的重要部分:
一元运算符“*”返回一个引用int的左值(无反引用)。一元运算符'&'然后获取左值的地址。 只要没有对越界指针的反引用,那么该操作就完全由标准覆盖,并且定义了所有行为。因此,通过我的阅读,上述内容是完全合法的。 许多STL算法依赖于定义良好的行为,这一事实暗示了标准委员会已经意识到了这一点,我确信有一种东西明确地涵盖了这一点。 下面的评论部分提出了两个论点:(请阅读:但它很长,我们最终都变成了巨魔) 论据1由于第5.7节第5段的规定,这是非法的
尽管这一部分是相关的;它不显示未定义的行为。我们正在讨论的数组中的所有元素要么在数组中,要么在数组的末尾(这在上面的段落中有很好的定义)。 论据2:
下面提出的第二个论点是:
尽管访问超出数组末尾的内存显然是未定义的行为。我不相信
许多其他参考维基百科和非规范来源。所有这些我都觉得无关紧要。 C++是由标准定义的 . 结论:不 下文提供了这些信息。如果你给我看一个标准参考,说明这是UB。我会的
这不是一个论点:
|
![]() |
8
2
n2798 ):
数组[5]不是我所能说的合格id(列表在第87页);最接近的似乎是标识符,但虽然数组是标识符,但数组[5]不是。它不是左值,因为“左值指的是对象或函数。”(第76页)。数组[5]显然不是函数,也不能保证引用有效对象(因为数组+5位于最后分配的数组元素之后)。 显然,它可能在某些情况下工作,但它不是有效的C++或安全的。 注意:通过数组添加一个是合法的(第113页):
但使用&这样做是不合法的;。 |
![]() |
9
2
编辑:如果你想让它对称,你可以写
|
![]() |
10
1
它应该是未定义的行为,原因如下:
|
![]() |
11
0
地址常量表达式是指向左值的指针……指针应使用一元和;运算符…或使用数组(4.2)类型的表达式。下标运算符[]…可用于创建地址常量表达式,但不能使用这些运算符访问对象的值。如果使用下标运算符,其操作数之一应为整型常量表达式。 在我看来像&数组(5)是合法C++,是地址常量表达式。 |
![]() |
12
-1
如果您的示例不是一般情况,而是特定情况,那么它是允许的。你可以 合法地 但它不适用于一般情况,即尝试访问距离数组末端1远的元素。 |
![]() |
13
-2
这是完全合法的。
|
![]() |
Oded S · 带有运算符重载函数的c++17求值顺序 7 年前 |
![]() |
Menachem · 如何在解码Base64字符串时处理错误 7 年前 |
![]() |
EFanZh · 有符号整数和无符号整数之间的转换 8 年前 |
![]() |
nickcoxdotme · 关注点的角度和语义标记/分离 11 年前 |