簡體   English   中英

C比較兩個指針大於一個是否為null

[英]C compare two pointers greater than if one is null

如果我比較CI中的兩個指針,我知道C 6.5.8 / 5,它說:

指向稍后聲明的結構成員的指針比指向結構中先前聲明的成員的指針要大

這很好但是如果其中一個指針是NULL呢? 我知道我可以做foo != NULL但是例如這是違反標准的:

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

該部分沒有專門解決NULL ,在大於這個的情況下,為什么我感到困惑。 如果你能告訴我它是否適用於C89以及C99。

澄清一下,這與我剛引用的標准部分的結構無關。 代碼與我上面描述的非常相似。 我有一些指向數組的指針,其中一個指針可能為null因此我想知道是否可以比較使用大於。

你的例子確實是未定義的。 C11,6.5.8。,p5中所述 ,每條規則都要求指針指向同一個對象或指向該對象的一個​​對象。

因此,可以使用關系運算符比較兩個指針: <, >, <=, >= ,只有當它們指向同一個對象或一個經過該對象時。 所有其他情況下:

6.5.8。 關系運算符,

  1. 在所有其他情況下,行為未定義。

值為NULL的指針(空指針)不指向對象。 這解釋如下:

6.3.2.3指針

  1. 如果將空指針常量轉換為指針類型,則保證將結果指針(稱為空指針)與指向任何對象或函數的指針進行比較。

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(即使那時它是違反標准的,因為空指針保證不指向任何對象內) ,所以比較變得有點無用

指向稍后聲明的結構成員的指針比指向結構中先前聲明的成員的指針要大

引用只描述結構中的成員變量。 例如:

struct A {
  int a;
  int b;
};

那么A的任何實例都有一個小於b的地址。

換句話說,如果有人寫了如下聲明:

 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。

規范還說,你只能使用除了相等或不等式之外的任何東西來比較兩個相關的指針。

因此,如果你有兩個指針指向同一個緩沖區中的不同位置,那么你可以使用大於或小於運算符來比較它們,而不是其他方面。

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

使用上面的內容,您可以使用<>比較buffer1ptr1 不能ptr1ptr2做到這一點,只能使用==!=運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM