C语言指针减法疑问:为何指针差值与结构体大小不符?
为什么指针算术运算的结果和预期不一样?
这是个非常典型的指针算术误区,我来给你把逻辑掰扯清楚:
首先得明确一个核心规则:C语言里的指针加减运算,是基于指针指向的类型大小来计算偏移的,不是直接操作原始字节数。
咱们对着你的代码和输出一步步拆解:
- 你的
struct metadata大小是32字节,这个输出已经明确验证了。 header是struct metadata*类型的指针,当你写header+1时,编译器会自动把偏移量乘以sizeof(struct metadata)——也就是1 * 32 = 32字节,所以地址从37704768跳到了37704800,这部分其实是符合底层逻辑的。- 但指针相减
(header+1) - header的规则不一样:同类型的两个指针相减,得到的结果是它们之间相差的「元素个数」,不是字节数。这里header+1和header正好差了1个struct metadata元素,所以结果自然是1,而不是你预期的32。
如果想要得到字节数的差值,你需要把指针转换成char*类型再计算——因为char的大小是1字节,指针算术在char*上就是按字节偏移的。比如修改代码如下:
printf("Byte difference: %d\n", (char*)(header+1) - (char*)header);
这时候输出就会是你预期的32了。
最后再给你划几个关键点:
- 指针算术永远和指针的指向类型绑定,偏移量是「元素个数 × 类型大小」
- 同类型指针相减的结果是元素个数,不是字节数
- 要计算字节差,要么转
char*,要么用uintptr_t(需包含<stdint.h>)把指针转成整数再相减
内容的提问来源于stack exchange,提问作者Khan9797
相关产品推荐
相关产品推荐

