类型转换时指针的行为

时间:2012-05-31 17:29:34

标签: c string

  

可能重复:
  Why do these two pointer subtractions give different results?

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

答案是0 ..你可以解释为什么会这样吗?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

我认为你可能想要做的是:

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

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