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

时间:2017-12-22 11:40:20

标签: c pointer-arithmetic

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

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

1 个答案:

答案 0 :(得分:4)

代码的行为未定义。

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

(v*)1000(v*)1359不满足该条件,因此您无法减去它们。

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

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