You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言指针减法疑问:为何指针差值与结构体大小不符?

为什么指针算术运算的结果和预期不一样?

这是个非常典型的指针算术误区,我来给你把逻辑掰扯清楚:

首先得明确一个核心规则:C语言里的指针加减运算,是基于指针指向的类型大小来计算偏移的,不是直接操作原始字节数。

咱们对着你的代码和输出一步步拆解:

  1. 你的struct metadata大小是32字节,这个输出已经明确验证了。
  2. header是struct metadata*类型的指针,当你写header+1时,编译器会自动把偏移量乘以sizeof(struct metadata)——也就是1 * 32 = 32字节,所以地址从37704768跳到了37704800,这部分其实是符合底层逻辑的。
  3. 但指针相减(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:46:20