#include <stdio.h>
int main(void){
int *ptr;
printf("the value of ptr is %p",ptr);
}
这给了我0x7fffbd8ce900
,它只有6个字节。它应该是8个字节(64位)吗?
答案 0 :(得分:13)
虽然指针是64位current processors actually only support 48 bits,但地址的高两个字节总是0000或(由于符号扩展)FFFF。
将来,如果48位不再足够,新处理器可以添加对56位或64位虚拟地址的支持,并且现有程序将能够利用额外空间,因为它们已经使用了64位位指针。
答案 1 :(得分:6)
这只意味着前两个字节为零(顺便提一下,目前保证x86-64芯片 - 但在这种情况下这并不意味着什么,因为你的指针没有被初始化)。允许%p
截断前导零,就像任何其他数字类型一样。但是,%016p
不是。这应该可以正常工作:
printf("the value of ptr is %016p", ptr);
答案 2 :(得分:-5)
因为6字节地址只是虚拟地址(实际物理地址的偏移量)。在物理体系结构(例如X86)中,存储器被分成可以由单个索引寄存器寻址而不改变16位段选择器的部分。在X86-CPU的实模式中,一个段总是使用16位(2字节)段选择器,它将在程序开始运行时由操作系统动态决定(即创建实际运行过程) )。
因此,如果您的变量具有48位地址0x7fffbd8ce900,并且您的程序具有段选择器偏移量08af,并且该变量的实际地址是(0x08af <&lt; 48)+ 0x7fffbd8ce900 = 0x08af7fffbd8ce900,即64位。
进一步阅读请转到: x86 memory segmentation