为什么在减去指向结构的指针时会得到奇怪的结果?

Why do I get weird results when subtracting pointers to structure?

我知道减去特定数据类型的指针应该 return 项目的数量(具有这种特定数据类型),这将在指针之间的内存中作为一个整体容纳。

我注意到如果结构体的大小不是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

您的代码的行为未定义。

您可以减去指针,如果它们指向同一数组中的元素,或指向该数组末尾的元素。 (出于此规则的目的,一个对象可以被视为一个元素的数组。)

(v*)1000(v*)1359不满足那个条件,所以不能相减。

此外,您应该使用 %td 作为 ptrdiff_t 类型的格式说明符:这是两个指针相减时得到的结果的类型。否则你有更多未定义的行为。

有关将 int 类型转换为指针类型的注释,请参阅 Cast int to pointer - why cast to long first? (as in p = (void*) 42; )