我知道减去特定数据类型的指针应该返回项目数(具有这种特定的数据类型),这将在指针之间的内存中整体容纳。
我注意到如果结构的大小不是2的幂,则减去指针的结果不是我所期望的。谁能解释一下为什么?
示例代码:
#include <stdio.h>
typedef struct st {
int i;
char c[7];
}v;
void main() {
v *p1 = (v*) 1000;
v *p2 = (v*) 1359;
printf("%ld\n", p2-p1);
}
输出:
6148914691236517235
答案 0 :(得分:4)
代码的行为未定义。
如果指针指向同一数组中的元素,或者指向该数组末尾的元素,则 仅可以减去指针。 (出于此规则的目的,可以将对象视为一个元素的数组。)
(v*)1000
和(v*)1359
不满足该条件,因此您无法减去它们。
此外,您应该使用%td作为ptrdiff_t类型的格式说明符:这是减去两个指针时获得的结果的类型。否则你有更多未定义的行为。
有关将int
类型转换为指针类型的注释,请参阅Cast int to pointer - why cast to long first? (as in p = (void*) 42; )