我正在研究指针算法,并遇到了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);
}
最佳答案
将两个指针相减不会得到一个指针(“地址”),而是会导致整数,即它们之间的“距离”。仅当两个指针都指向同一数组时才有意义。同样,比较指针仅在它们位于同一数组中才有意义。
如果没有意义,则结果是不确定的-这并不意味着程序将失败,崩溃或产生任何类型的错误。这意味着可能发生任何事情,您无权投诉。