我刚刚执行了这个代码示例:
int *i = (int*) malloc( sizeof(int) );
printf( "%p, %p\n", &i , i );
这就是我得到的:
0x7fff38fed6a8, 0x10f7010
所以我想知道为什么第二个地址比第一个地址短?
答案 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)