可能重复:
为什么这两个指针减法会给出不同的结果?
char arr[] = "stackoverflow";
char *p1 = arr;
char *p2 = arr + 3;
printf("%d", (int*)p2 - (int*)p1);
它的答案是 0 ..你能解释一下为什么会这样吗?
可能重复:
为什么这两个指针减法会给出不同的结果?
char arr[] = "stackoverflow";
char *p1 = arr;
char *p2 = arr + 3;
printf("%d", (int*)p2 - (int*)p1);
它的答案是 0 ..你能解释一下为什么会这样吗?
因为p2 - p1
是< sizeof (int)
。因此(int *) p2 - (int *) p1 == 0
,int
两个指针之间的元素数。
因为您正在调用实现定义/未定义的行为。Anint
在您的平台上的大小可能为 4,因此这些指针中至少有一个未正确对齐。
在实践中,这可能是因为编译器正在做一些类似(p2 / 4) - (p1 / 4)
的事情。
我想你可能打算做的是:
printf("%d", (int)(p2 - p1));
但这甚至不需要转换,因为两个指针之间的差异返回一个有符号整数类型 ( ptrdiff_t
),因此您可以省略类型转换并更改"%d"
为"%td"
.