[英]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。 关系运算符,
- 。 在所有其他情况下,行为未定义。
值为NULL的指针(空指针)不指向对象。 这解释如下:
6.3.2.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(即使那时它是违反标准的,因为空指针保证不指向任何对象内) ,所以比较变得有点无用
指向稍后声明的结构成员的指针比指向结构中先前声明的成员的指针要大
引用只描述结构中的成员变量。 例如:
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;
使用上面的内容,您可以使用<
和>
比较buffer1
和ptr1
。 你不能用ptr1
和ptr2
做到这一点,只能使用==
或!=
运算符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.