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

C语言指针字节宽度疑问:为何malloc返回的指针显示长度更短

你观察到的是printf的%p格式符的显示特性,和指针实际的宽度没有关系,「同一C实现下所有指针宽度相同」的结论是完全正确的。

具体原因拆解

  • 64位环境下所有指针的实际长度都是8字节,你可以额外加一行代码验证两者的内存占用:
printf("&i 占用字节数:%zu,j 占用字节数:%zu\n", sizeof(&i), sizeof(j));

运行后你会发现两个输出值完全相等,不存在长度不同的问题。

  • %p输出地址时会自动省略高位的前导零:你拿到的malloc返回值0x6686b0,完整的64位地址实际是0x00000000006686b0,前面的5个字节都是0,输出时被默认省略了,所以看起来只有3字节长度。而栈上变量的地址属于进程地址空间的高地址区域,高位不存在连续的全0,因此会完整打印所有有效位,看起来更长。
  • 两类地址的差异也符合主流系统的虚拟地址空间布局规则:栈区默认分配在高地址空间,堆区默认分配在低地址空间,所以你会看到栈上变量的地址远大于malloc返回的堆地址。

内容的提问来源于stack exchange,提问作者Ait-Gacem Nabil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:54:04