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