1

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

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

这就是我得到的:

0x7fff38fed6a8, 0x10f7010

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

4

5 回答 5

5

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

&i = 0x7fff38fed6a8; // stack
 i = 0x0000010f7010; // heap
于 2012-05-15T09:13:37.927 回答
4

i是堆上的地址,&i而是栈上的地址。堆和栈占用不同的地址范围,所以你会看到不同的数字。

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

于 2012-05-15T09:12:40.447 回答
1

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

const void *nada = NULL;

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

你可能会看到这样的东西:

NULL is at 0x0

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

更新:误读了问题的代码,我删除了不相关的文本。

于 2012-05-15T09:11:15.617 回答
1

它不是更短,只是数字更小。指针 &i 在堆栈上,而 i 在堆上。

于 2012-05-15T09:13:20.343 回答
1

除了其他答案:

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

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

于 2012-05-15T11:15:27.427 回答