15
#include <stdio.h>
int main(void){
  int *ptr;
  printf("the value of ptr is %p",ptr);
}

这给了我0x7fffbd8ce900,只有 6 个字节。应该是 8 字节(64 位)吗?

4

3 回答 3

20
于 2012-07-17T03:38:45.593 回答
6

这只是意味着前两个字节为零(顺便说一句,目前 x86-64 芯片可以保证这一点——但在这种情况下这并不意味着什么,因为您的指针未初始化)。%p允许截断前导零,就像任何其他数字类型一样。%016p,然而,不是。这应该可以正常工作:

printf("the value of ptr is %016p", ptr);
于 2012-07-17T03:36:35.137 回答
-6

因为 6 字节地址只是虚拟地址(实际物理地址的偏移量)。在物理架构(例如 X86)中,内存被划分为可以由单个索引寄存器寻址的部分,而无需更改 16 位段选择器。在 X86-CPU 的实模式下,一个段总是使用 16 位(2 字节)的段选择器,这将在程序开始运行时由操作系统动态决定(即创建实际运行的进程) )。

因此,如果您的变量具有 48 位地址 0x7fffbd8ce900,并且您的程序具有段选择器偏移量 08af,则变量的实际地址为 (0x08af<<48)+0x7fffbd8ce900 = 0x08af7fffbd8ce900,即 64 位。

进一步阅读请转向: x86内存分割

于 2012-07-17T06:43:08.410 回答