是NULL指针<任何其他指针(NULL除外)?

bec*_*cko 4 c pointers

关于C标准的另一个问题.我已经测试了这个并且我总是变得NULL < ptr真实,ptr任何指针都不同于哪里NULL.但我知道标准说指针算术和比较仅在数组的边界内定义.我只是不确定特定的比较NULL < ptr是否合法.

编辑:我一直在阅读K&R,我发现以下引用:

任何指针都可以有意义地与零相等或不等式进行比较.但是对于算术或与不指向同一数组成员的指针进行比较的行为是未定义的.

我不确定这是否会影响已经提出这个问题的答案.在任何情况下,我仍然不确定是否p > NULL总是保证返回true,p指针在哪里!=NULL.

Jam*_*lis 6

NULL < ptr无效:无法对空指针进行关系比较.这样做会产生未定义的行为.

你是正确的,你只能比较指向同一个对象的指针(无论是数组中的元素还是聚合的子对象).由于空指针不指向任何对象,因此无法将其与任何对象进行关联比较.

  • @JoshPetitt:这里重要的是C中指针的关系比较被限制在一小组有效场景中.两个操作数必须是指向同一聚合的指针,否则`<`的行为是未定义的.所以,如果你有`int main(){int x,y; return&x <&y; },行为未定义.由于空指针指向无对象,因此执行关系比较,其中操作数(或两个操作数!)都是空指针会产生未定义的行为. (6认同)
  • @JensGustedt:平台不需要有线性地址空间来实现uintptr_t.C标准没有为它定义语义,除了将指针转换为它并返回产生比较等于原始值的东西. (4认同)
  • @R ..只有在完全定义了`uintprt_t`时,这或多或少相当于说平台有一个线性地址空间. (3认同)
  • 但请注意,定义了`(uintptr_t)&x <(uintptr_t)&y`,对于函数的任何给定调用,它将为0或1. (2认同)
  • @JoshPetitt,没有`NULL`和其他空指针不一定具有对应于所有位零的内部表示. (2认同)