#include <stdio.h>
int main(void){
int *ptr;
printf("the value of ptr is %p",ptr);
}
这给了我0x7fffbd8ce900
,只有 6 个字节。应该是 8 字节(64 位)吗?
这只是意味着前两个字节为零(顺便说一句,目前 x86-64 芯片可以保证这一点——但在这种情况下这并不意味着什么,因为您的指针未初始化)。%p
允许截断前导零,就像任何其他数字类型一样。%016p
,然而,不是。这应该可以正常工作:
printf("the value of ptr is %016p", ptr);
因为 6 字节地址只是虚拟地址(实际物理地址的偏移量)。在物理架构(例如 X86)中,内存被划分为可以由单个索引寄存器寻址的部分,而无需更改 16 位段选择器。在 X86-CPU 的实模式下,一个段总是使用 16 位(2 字节)的段选择器,这将在程序开始运行时由操作系统动态决定(即创建实际运行的进程) )。
因此,如果您的变量具有 48 位地址 0x7fffbd8ce900,并且您的程序具有段选择器偏移量 08af,则变量的实际地址为 (0x08af<<48)+0x7fffbd8ce900 = 0x08af7fffbd8ce900,即 64 位。
进一步阅读请转向: x86内存分割