C 键入时指针的行为

C 键入时指针的行为,c,string,C,String,可能重复: 答案是0。您能解释一下为什么会这样吗?因为您正在调用实现定义的/未定义的行为。在您的平台上,int的大小可能为4,因此至少有一个指针没有正确对齐 实际上,这可能是因为编译器在引擎盖下执行类似于(p2/4)-(p1/4)的操作。因为p2-p1是

可能重复:


答案是0。您能解释一下为什么会这样吗?

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


实际上,这可能是因为编译器在引擎盖下执行类似于
(p2/4)-(p1/4)
的操作。

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

我想你可能想做的是:

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

但这甚至不需要转换,因为两个指针之间的差返回一个带符号的整数类型(
ptrdiff\u t
),因此您可以省去类型转换,并将
%d“
更改为
%td”

请确保代码首先是可编译的……甚至
(p2-p1)&~3
:-)3从何而来?它不是完全没有定义的行为吗?您试图在无效指针上执行指针算术,句号。@Kylo:我的意思是编译器会丢弃每个值的2个LSB。虽然实际上除法在这里更有意义,所以我编辑了答案。@KerrekSB:不确定。我现在在对冲我的赌注!如果省略强制转换,则需要使用
t
length修饰符:
printf(“%td”,p2-p1)
这个
%d
是一个
int
参数。伙计,我明白了!!我只是错过了da部分:)
printf("%d",  (int)(p2 - p1));