2

可能重复:
为什么这两个指针减法会给出不同的结果?

char arr[] = "stackoverflow";
char *p1 = arr;
char *p2 = arr + 3;
printf("%d",  (int*)p2 - (int*)p1);

它的答案是 0 ..你能解释一下为什么会这样吗?

4

3 回答 3

4

因为p2 - p1< sizeof (int)。因此(int *) p2 - (int *) p1 == 0int两个指针之间的元素数。

于 2012-05-31T17:34:34.853 回答
3

因为您正在调用实现定义/未定义的行为。Anint在您的平台上的大小可能为 4,因此这些指针中至少有一个未正确对齐。

在实践中,这可能是因为编译器正在做一些类似(p2 / 4) - (p1 / 4)的事情。

于 2012-05-31T17:31:08.950 回答
0

我想你可能打算做的是:

printf("%d",  (int)(p2 - p1));

但这甚至不需要转换,因为两个指针之间的差异返回一个有符号整数类型 ( ptrdiff_t),因此您可以省略类型转换并更改"%d""%td".

于 2012-05-31T17:35:27.650 回答