C比较两个指针是否大于一个是否为空

C compare two pointers greater than if one is null

如果我在 C 中比较两个指针,我知道 C 6.5.8/5 说:

pointers to structure members declared later compare greater than pointers to members declared earlier in the structure

很好,但是如果其中一个指针是 NULL 怎么办?我知道我可以做到 foo != NULL 但例如这是否违反标准:

char *bar = NULL;
char *foo = "foo";
if(foo > bar) { function(); }

该部分没有具体说明 NULL 大于的情况,这就是我感到困惑的原因。另外,如果你能告诉我它是否适用于 C89 以及 C99。

澄清一下,这与我引用的标准中的结构无关。代码与我上面描述的非常相似。我有一些指向数组的指针,其中一个指针可能为空,因此我想知道是否可以使用大于号进行比较。

pointers to structure members declared later compare greater than pointers to members declared earlier in the structure

引用仅描述了结构中的成员变量。例如:

struct A {
  int a;
  int b;
};

然后 A 的任何实例都具有小于 b 的地址 a。

换句话说,如果有人写出如下语句:

 A instanceA;
 int* aa = &(instanceA.a);
 int* ab = &(instanceA.b);

那么保证ab > aa作为成员变量b的定义晚于a。

那段代码说的是:

#include <stdio.h>

struct things {
    int blah;
    int laterz;
};   

struct things t;

int main ( void ) {

    int * a = &t.blah;
    int * b = &t.laterz;

    printf("%p < %p\n", (void *)a, (void *)b);
    return 0;
}

指向 laterz 的指针大于 1 到 blah。

C99 标准说:

If the objects pointed to are members of the same aggregate object, pointers to structure members declared later compare greater than pointers to members declared earlier in the structure, and pointers to array elements with larger subscript values compare greater than pointers to elements of the same array with lower subscript values.

这里的关键在same object:

struct {
  int a; // structrure members
  int b;
} some_struct;

// so pointers to structure members:
&(some_struct.b) > &(some_struct.a)

同样适用于数组:

char arr[128];
&(arr[100]) > &(arr[1])

如果指针是 NULL 那么它很可能不指向同一数据结构的成员,除非您正在对 BIOS 进行编程(即使那样它也是违反标准的,因为空指针保证不会指向任何对象内部),所以比较变得有点无用

规范还指出,您只能使用相等或不等以外的任何其他方法来比较两个 相关 指针。

因此,如果您有两个指针都指向同一缓冲区中的不同位置,那么您可以使用大于或小于运算符来比较它们。而不是其他方式。

例子

char buffer1[] = "foobar";
char buffer2[] = "some other text";
char *ptr1 = buffer1 + 3;
char *ptr2 = buffer2;

根据以上内容,您可以使用 <> 来比较 buffer1ptr1。你不能ptr1ptr2做到这一点,只能使用==!=运算符。

你的例子确实是未定义的。如 C11, 6.5.8., p5 中所述,每条规则都要求指针指向同一个对象 或一个过去的对象。

因此,可以使用关系运算符比较两个指针:<, >, <=, >=,仅当它们指向同一对象或指向该对象的前一个时。 所有其他情况:

6.5.8. Relational operators,

  1. . In all other cases, the behavior is undefined.

Pointer with value NULL,空指针,不指向对象。解释如下:

6.3.2.3 Pointers

  1. If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.