Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 与sizeof和addressof的明显差异_C_Sizeof_Address Operator - Fatal编程技术网

C 与sizeof和addressof的明显差异

C 与sizeof和addressof的明显差异,c,sizeof,address-operator,C,Sizeof,Address Operator,sizeof(long)返回8个字节,但&along(long的地址)是12个十六进制数字(48位)或6个字节。在OS X上,使用clang编译64位。这里是否存在差异,或者这是一个真正的64位地址空间?我认为您混淆了两个不同的概念。Sizeof告诉您地址的长度,而不是现在的长度。long占用6个字节的内存,但指向它的指针(显然)只占用6个字节(或者更可能占用8个字节,但由于内存的布局,前两个字节都为零) 让我进一步解释一下地址空间。虽然64位处理器中的指针长度为8字节,但地址空间很少需要这么多

sizeof(long)返回8个字节,但&along(long的地址)是12个十六进制数字(48位)或6个字节。在OS X上,使用clang编译64位。这里是否存在差异,或者这是一个真正的64位地址空间?

我认为您混淆了两个不同的概念。Sizeof告诉您地址的长度,而不是现在的长度。long占用6个字节的内存,但指向它的指针(显然)只占用6个字节(或者更可能占用8个字节,但由于内存的布局,前两个字节都为零)

让我进一步解释一下地址空间。虽然64位处理器中的指针长度为8字节,但地址空间很少需要这么多。这样就可以寻址2^64字节,远远超过我们的需要。因此,为了简单起见,许多处理器和编译器只使用其中的48位。有关一些有用的图表,请参见此wikipedia链接:


我不确定这是否就是您看到这种情况的确切原因,但当前的64位处理器通常没有64位地址空间。所涉及的额外硬件将是一种浪费,因为48位地址空间超出了我一生中的预期需求。这可能是因为您看到的是地址的截断版本(即,地址前面没有用零填充)。

一个地址就是一个内存位置。在32位系统上是32位长,在64位系统上是64位,依此类推

变量的
大小是它占用的内存量。它们是完全不相关的数字

sizeof(long)返回8个字节,但&along(long的地址)是12个十六进制数字(48位)或6个字节

是的,因为打印数字时,不会打印前导0。例如:

int x = 0x0000000F;
printf( "%X", x );
// prints "F"

实际上,现代系统使用64位作为地址,但并不是所有这些地址都被系统使用,因为2到64是一个在不久的将来没有人会使用的内存量。在linux下,您可以通过执行
cat/proc/cpuinfo
来了解您的机器实际使用了什么。在我的机器上我有

地址大小:36位物理地址,48位虚拟地址


因此,这将允许64 GiB的物理内存和256 TiB的虚拟内存。这在很大程度上足以满足这台机器将遇到的情况

有趣的是,前两个字节都是零。你能扩展一下“内存是如何布局的”吗?正如你所说,它可能是地址的截断版本。这就是重点。它不是“显示”64位地址,只有48位(12个十六进制数字)一个long类型的变量占用8个字节。下面是一些long类型变量的地址:a的地址是:0x7fff6338eb08;b的地址是:0x7fff6338eb00;c的地址是:0x7FFF6338EAF8。它们可能并非完全无关。我的理解是,内存地址的大小决定了可以引用的最大内存量。那么,如果上面地址的大小是48位,那么它是一个64位系统吗?@spinozagl:因为前导的0没有打印出来
sizeof(一些指针类型)==8,这才是重要的。也许我应该使用不同的单词或不同的单词排列。我确实意识到address操作符和sizeof操作符之间的区别。不知何故,有一个潜意识的假设,如果一个(原语)类型的大小是8字节,那么它的地址也应该是8字节长。如果地址不是8字节,则它似乎不是64位系统。也就是说,正如@Jens Gustedt所说的那样,您几乎所有的回复都有助于理解,“……64位用于地址,但并非所有这些都被使用……”。非常感谢所有回应的人。