我刚刚执行了这个代码示例:
int *i = (int*) malloc( sizeof(int) );
printf( "%p, %p\n", &i , i );
这就是我得到的:
0x7fff38fed6a8, 0x10f7010
所以我想知道为什么第二个地址比第一个短?
我刚刚执行了这个代码示例:
int *i = (int*) malloc( sizeof(int) );
printf( "%p, %p\n", &i , i );
这就是我得到的:
0x7fff38fed6a8, 0x10f7010
所以我想知道为什么第二个地址比第一个短?
i
它在堆栈上,而它指向的内存块在堆中。在您的平台上,这是两个非常不同的内存区域,恰好堆地址在数字上相对较低,因此它有很多未显示的前导零,即
&i = 0x7fff38fed6a8; // stack
i = 0x0000010f7010; // heap
i
是堆上的地址,&i
而是栈上的地址。堆和栈占用不同的地址范围,所以你会看到不同的数字。
指针实际上并没有不同的长度:较短的指针前面有零。您可能在 64 位机器上运行它,因此每个指针都有 64 位(16 个十六进制数字)。
格式说明符不要求%p
将输出填充到任何固定长度。因此,您无法从打印的表示中推断出有关地址的内存“长度”的任何信息。例如,如果您这样做:
const void *nada = NULL;
printf("NULL is at %p\n", nada);
你可能会看到这样的东西:
NULL is at 0x0
当然,这并不是说void *
当值是 时,类型神奇地只占用了 4 位NULL
,它只是意味着当指针值转换为字符串时,前导零被省略了。
更新:误读了问题的代码,我删除了不相关的文本。
它不是更短,只是数字更小。指针 &i 在堆栈上,而 i 在堆上。