空指针是否小于其他指针(除了空指针)?

4
关于 C 标准的另一个问题。我已经测试过了,对于任何不同于 NULL 的指针 ptr,语句 NULL < ptr 都是 true。但我知道标准规定指针运算和比较只有在数组范围内才有定义。我不确定这个特定的比较 NULL < ptr 是否合法。
编辑:我一直在阅读 K&R,发现了以下引用:
任何指针都可以与零相等或不相等地进行有意义的比较。但是对于指向不属于同一个数组成员的指针的算术或比较行为是未定义的。
无论如何,我仍然不确定指针 p !=NULL 时语句 p > NULL 是否保证总是返回 true。
2个回答

6

NULL < ptr 是无效的:空指针不能进行关系比较。这样做会产生未定义行为。

你是正确的,只有指向同一对象的指针(或数组中的元素或聚合物的子对象)才能进行关系比较。由于空指针没有指向任何对象,因此您无法将其与任何内容进行关系比较。


6
这段话的重点是,在C语言中,指针之间的关系比较只能在非常有限的情况下使用。两个操作数必须是指向同一个聚合体的指针,否则<的行为将是未定义的。因此,如果你有这样的代码:int main(){ int x, y; return &x < &y; },那么行为是未定义的。由于空指针不指向任何对象,所以进行指向空指针的关系比较(其中一个或两个操作数都是空指针)也会导致未定义的行为。 - James McNellis
2
请注意,(uintptr_t)&x < (uintptr_t)&y 是有定义的,并且对于函数的任何给定调用,它将是 0 或 1。 - R.. GitHub STOP HELPING ICE
3
只有当uintprt_t被定义,并且这基本上等同于说如果平台具有线性地址空间,才会这样做。 - Jens Gustedt
2
@JoshPetitt,没有NULL和其他空指针并不一定具有与所有位为零相对应的内部表示。 - Jens Gustedt
4
@JensGustedt:一个平台不需要具有线性地址空间来实现uintptr_t。 C标准未定义其除将指针转换为其然后返回与原始值相等的内容之外的任何语义。 - Eric Postpischil
显示剩余2条评论

3

只有与另一个NULL(=true)比较或不比较(=false)被定义。

通常情况下,NULL被定义为零,因此通常比较小,但实际上它没有被定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接