为什么在减去指向结构的指针时会得到奇怪的结果?
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; )
我知道减去特定数据类型的指针应该 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; )