C: NULL > NULL 总是 false?

问题描述 投票:0回答:1

C 标准是否保证

NULL > NULL
始终为 false?我问是因为 初始或终端 malloc 缓冲区可能吗? 中的对话似乎应该小心指针比较,并且只有在处理指向同一数组元素的指针时才进行比较,松散地说。然而,保证
NULL > NULL
是很方便的,因为我想要一个结构体,它是一个堆栈数组,具有第一个和最后一个元素的字段,如果这个数组仍然有
0
元素,那么很方便将这些字段设置为
NULL
,并且仍然允许
for
循环遍历数组的元素,而不需要明确检查数组是否有
0
元素或更多,所以这样的比较很方便......

c pointers standards null-pointer
1个回答
0
投票

令人惊讶的是,它似乎会导致未定义的行为。只有

==
!=
可以使用空指针。

C17 6.5.8 关系运算符 /5

比较两个指针时,结果取决于地址空间中的相对位置 所指向的对象。如果两个指向对象类型的指针都指向同一个对象,或者都指向 经过同一数组对象的最后一个元素后,它们比较相等。如果对象指向 是同一个聚合对象的成员,后面声明的结构体成员的指针比较 大于指向结构中先前声明的成员的指针,以及指向数组元素的指针 具有较大下标值的比较大于指向同一数组元素的指针,具有较小的下标值 下标值。指向同一联合对象成员的所有指针比较相等。如果表达式 P 指向数组对象的一个元素,表达式 Q 指向该数组对象的最后一个元素 数组对象时,指针表达式 Q+1 比较大于 P。 在所有其他情况下,行为是 未定义。

(粗体我的)

这与 C++ 不同,C++ 中有一个子句明确表示

<
,
<=
,
>
,
>=
==
,
!=
:

一致

[expr#rel]/5

如果两个操作数

p
q
比较相等 ([expr.eq]),则
p<=q
p>=q
都产生
true
,并且
p<q
p>q
都产生
false
。 ...

© www.soinside.com 2019 - 2024. All rights reserved.