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

时间:2016-02-07 09:13:46

标签: c pointers c89

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

  

指向稍后声明的结构成员的指针比指向结构

中先前声明的成员的指针要大

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

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

如果我感到困惑,那么该部分并没有专门针对NULLMyClass.class.getClassLoader().getResourceAsStream("myfile.properties") 。如果你能告诉我它是否适用于C89以及C99。

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

5 个答案:

答案 0 :(得分:3)

C99标准说:

  

如果指向的对象是相同聚合对象的成员,   稍后声明的结构成员的指针比指向成员的指针要大   在结构的前面声明,并且指向具有较大下标值的数组元素的指针比指向具有较低下标的相同数组的元素的指针大   值。

此处的密钥位于同一对象

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进行编程(即使它违反了标准,因为空指针保证不指向任何对象内部,所以比较变得有点无用

答案 1 :(得分:3)

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

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

  

6.5.8。关系运算符,

     
      
  1. 。在所有其他情况下,行为未定义。
  2.   

值为NULL的指针,空指针,不指向对象。这在下面解释:

  

6.3.2.3指针

     
      
  1. 如果将空指针常量转换为a   指针类型,结果指针,称为空指针,保证比较不等   指向任何对象或函数的指针。
  2.   

答案 2 :(得分:0)

  

指向稍后声明的结构成员的指针比指向结构

中先前声明的成员的指针要大

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

struct A {
  int a;
  int b;
};

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

换句话说,如果有人写下如下声明:

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

然后保证ab> aa作为成员变量b的定义晚于。

答案 3 :(得分:0)

这部分代码正在谈论:

#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的指针大于一个等等。

答案 4 :(得分:0)

规范还说,你只能使用除了相等或不等式之外的任何东西来比较两个相关的指针。

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

实施例

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

通过上述内容,您可以使用buffer1ptr1来比较<>。您无法使用ptr1ptr2执行此操作,只能使用==!=运营商。