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
相关产品推荐
相关产品推荐

