我正在研究指针算法,并遇到了C标准中有关指针减法和比较的两个规则。

规则1:当减去两个指针时,两个指针都必须指向同一数组对象的元素,或者仅指向数组对象的最后一个元素之后的元素(C标准,6.5.6);结果是两个数组元素的下标不同。否则,该操作是未定义的行为(48)。

规则2:类似,使用关系运算符 =和>比较指针可得出指针相对于彼此的位置。使用关系运算符(6.5.8)比较未指向同一聚合或​​并集的指针(也不会超出同一数组对象)。否则,该操作是未定义的行为(53)。

减去或比较不引用同一数组的指针是未定义的行为。

问题1:根据上述规则1,行为未定义,但是程序确实将地址打印为输出。当我尝试取消引用包含地址的变量时,程序崩溃。为什么会有一个地址存在但该地址指向的值不存在?

问题2:按照上述规则2,使用关系运算符比较引用两个不同数组的两个指针是未定义的行为,程序应该崩溃,但最终输出?那怎么可能?

有人可以帮我解决这个规则混乱吗?我已经发布了以下代码:

#include <stdio.h>

int main()
{
 char *pointer_1;
 char *pointer_2;
 char *difference;
 int counter=0;

 char string[20]={"Pointer Arithmetic"};
 char str[30]={"Substraction and Comparison"};

 pointer_1=string;
 pointer_2=str;

 difference=(char *)(pointer_2-pointer_1);
 printf("%p\n",difference); Address exists

/*printf("%c\n",difference);*/ Dereferencing leads to program crash

 while(pointer_1>pointer_2) Is one is allowed to use relational operators on
                               pointers which point to two different arrays?
  {
    {
      counter++;
      pointer_2++;
     }
  }

  printf("%d",counter);

}

最佳答案

将两个指针相减不会得到一个指针(“地址”),而是会导致整数,即它们之间的“距离”。仅当两个指针都指向同一数组时才有意义。同样,比较指针仅在它们位于同一数组中才有意义。

如果没有意义,则结果是不确定的-这并不意味着程序将失败,崩溃或产生任何类型的错误。这意味着可能发生任何事情,您无权投诉。

10-07 19:34
查看更多