指针地址如何具有不同的长度?

时间:2012-05-15 09:08:25

标签: c pointers c99 pointer-address

我刚刚执行了这个代码示例:

int *i = (int*) malloc( sizeof(int) );
printf( "%p, %p\n", &i , i );

这就是我得到的:

0x7fff38fed6a8, 0x10f7010

所以我想知道为什么第二个地址比第一个地址短?

5 个答案:

答案 0 :(得分:5)

i在堆栈上,而它指向的内存块在堆中。在你的平台上,这是两个非常不同的内存区域,它恰好在堆数方面相对较低,在数值上,因此它有很多未显示的前导零,即

&i = 0x7fff38fed6a8; // stack
 i = 0x0000010f7010; // heap

答案 1 :(得分:4)

i是堆上的地址,而&i是堆栈上的地址。堆和堆栈占用不同的地址范围,因此您可以看到不同的数字。

指针实际上并不是不同的长度:较短的指针前面是零。您可能在64位计算机上运行此操作,因此每个指针都有64位(16位十六进制数字)。

答案 2 :(得分:1)

不要求%p格式化说明符将输出填充到任何固定长度。因此,您无法从打印的表示中推断出有关地址的内存“长度”的任何信息。例如,如果你这样做:

const void *nada = NULL;

printf("NULL is at %p\n", nada);

您可能会看到类似这样的内容:

NULL is at 0x0

当然,这并不意味着void *类型在值NULL时神奇地只占用4位,它只是意味着当指针值转换为字符串时,前导零被省略了。

更新:误读了问题的代码,删除了无关的文字。

答案 3 :(得分:1)

它不短,只是数字较小。 Pointer& i在堆栈上,我在堆上。

答案 4 :(得分:1)

除了其他答案:

由于您没有包含<stdlib.h>,编译器很可能错误地认为malloc返回int而不是void*。这是一个可能很严重的错误,你已经隐藏了malloc的返回值的类型转换。阅读thisthis

如果int的宽度与特定系统上的地址总线的宽度不同,例如在许多16位或64位CPU上,则会得到不正确的结果。