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

问题描述 投票:-1回答:1

这个问题在这里已有答案:

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

我注意到如果结构的大小不是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
c pointer-arithmetic
1个回答
4
投票

代码的行为未定义。

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

(v*)1000(v*)1359不满足这个条件,所以你不能减去它们。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.