行为时,类型强制转换
可能重复:
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..Can你解释为什么会这样呢?
因为p2 - p1
是< sizeof (int)
。所以(int *) p2 - (int *) p1 == 0
,这两个指针之间的元素数量为int
。
thnx男人,我明白了! woo我只是错过了da部分:) – vijay
因为您正在调用实现定义的/未定义的行为。一个int
可能在您的平台上的大小为4,所以至少有一个指针没有正确对齐。
实际上,这可能是因为编译器正在做一些类似于(p2/4) - (p1/4)
的内容。
...甚至是'(p2-p1)&〜3':-) – dasblinkenlight
〜3从哪里来? – Kylo
是不是只是平坦的*未定义*的行为?您正在尝试对无效指针进行指针运算。 –
我想你大概的意思做的是:
printf("%d", (int)(p2 - p1));
但是,这甚至不需要转换,因为两个指针之间的差异返回一个符号整数类型(ptrdiff_t
),这样你就可以离开了类型转换并将"%d"
更改为"%td"
。
如果你省略了演员,你需要使用't'长度修饰符:'printf(“%td”,p2 - p1);''%d'用于'int'论据。 – ouah
请确保代码是可编译的第一个... – kennytm
什么是'ptr1'? – dirkgently