64位机器上的c ++指针

时间:2011-08-25 12:55:54

标签: c++ pointers

我在64位linux下使用c ++,编译器(g ++)也是64位。当我打印某个变量的地址时,例如一个整数,它应该打印一个64位整数,但实际上它会打印一个48位整数。

int i;
cout << &i << endl;

output: 0x7fff44a09a7c

我想知道其他两个字节在哪里。期待你的帮助。

感谢。

3 个答案:

答案 0 :(得分:8)

在大多数C ++实现中打印地址会抑制前导零以使事物更具可读性。像0x00000000000013fd这样的东西并没有真正增加价值。

当您想知道为什么通常在用户空间中看不到超过48位的值时,这是因为当前的AMD64架构被定义为具有48位的虚拟地址空间(例如,cat /proc/cpuinfo可以看到Linux)的

答案 1 :(得分:3)

他们在那里 - 他们没有去过任何地方 - 它只是流中的格式。它会跳过前导零(检查流的填充和宽度属性)。

编辑:再想一想,我认为没有一种很好的方法可以改变指针默认operator<<的格式。如果使用std::hex操纵器流出,则可以更改填充和宽度属性。

答案 2 :(得分:1)

为了好玩,你可以使用C输出,看看它是否更像你所追求的:

printf("0x%p");