【问题标题】:How can pointer addresses have different lengths?指针地址如何具有不同的长度?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          const void *nada = NULL;
          
          printf("NULL is at %p\n", nada);
          

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

          NULL is at 0x0
          

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

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

          【讨论】:

          • @PaulR:哦​​,误读了问题的代码。谢谢,已修复!
          【解决方案5】:

          除了其他答案:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-10-28
            • 1970-01-01
            • 2018-06-04
            • 1970-01-01
            • 2011-08-14
            • 1970-01-01
            • 2019-09-07
            相关资源
            最近更新 更多