C: NULL > NULL 总是假?

Sas*_*sha 2 c standards pointers null-pointer

type_t* x = NULL; type_t* y = NULL;鉴于我们总是x > y评估错误,C 标准是否能保证这一点?我问因为会话在初始或终端malloc缓冲区中可能吗?由此看来,人们应该小心指针比较,并且只有在处理指向同一数组元素的指针时才进行比较,松散地说。但是,保证评估为 false 很方便x > y,因为我想要一个结构,它是一个堆栈数组,具有第一个和最后一个元素的字段,如果该数组仍然有0元素,则设置这些字段很方便是NULL,并且仍然允许for循环遍历数组的元素是很方便的,而不需要显式检查数组是否有0元素或更多,所以这样的比较很方便......

Hol*_*Cat 5

令人惊讶的是,在 C 语言中它似乎会导致未定义的行为。只能==与 和 一起!=使用空指针。解决方法是将指针投射到uintptr_t并比较结果。

C17 6.5.8 关系运算符 /5

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

(粗体我的)

这与 C++ 不同,C++ 有一个子句明确表示<, <=, >,与,>=一致:==!=

[expr#rel]/5

如果两个操作数pq比较相等 ([expr.eq]),p<=q并且p>=q两者都产生truep<qp>q都产生false。...