行为时,类型强制转换

问题描述:

可能重复:
Why do these two pointer subtractions give different results?行为时,类型强制转换

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

它的答案是0..Can你解释为什么会这样呢?

+1

请确保代码是可编译的第一个... – kennytm

+1

什么是'ptr1'? – dirkgently

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

+0

thnx男人,我明白了! woo我只是错过了da部分:) – vijay

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

实际上,这可能是因为编译器正在做一些类似于(p2/4) - (p1/4)的内容。

+0

...甚至是'(p2-p1)&〜3':-) – dasblinkenlight

+0

〜3从哪里来? – Kylo

+0

是不是只是平坦的*未定义*的行为?您正在尝试对无效指针进行指针运算。 –

我想你大概的意思做的是:

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

但是,这甚至不需要转换,因为两个指针之间的差异返回一个符号整数类型(ptrdiff_t),这样你就可以离开了类型转换并将"%d"更改为"%td"

+1

如果你省略了演员,你需要使用't'长度修饰符:'printf(“%td”,p2 - p1);''%d'用于'int'论据。 – ouah