【问题标题】:Sizeof pointer differs from its representation with printf?sizeof 指针与 printf 的表示不同?
【发布时间】:2014-12-05 05:50:16
【问题描述】:

当我这样做时

int k = 9;
printf("sizeof k: %zu \n", sizeof (&k));

我得到的大小为8。但是当我这样做时

printf("pointer to k: %p \n", &k);

我收到0x7fff57e3ba24。我可以看到这是 12 个十六进制数字,这意味着(因为 1 个十六进制是 4 位)指针占用 48 位,即 6 个字节。

问题:为什么 sizeof 为指针打印 8,尽管它只有 6 个字节?

【问题讨论】:

  • 虽然 amd64 ISA 使用 64 位指针,但实际上目前只使用了 48 位。因此,在当今的大多数桌面系统上,您确实会看到“48 位”指针存储在 64 位插槽中。
  • @JohnZwinck 因为在如此“遥远”的位置不存在地址来占用整个 64 位? (也就是说内存没有那么多槽?)
  • @user10607:见这里:stackoverflow.com/questions/6716946/…
  • 哇,通过阅读这篇文章,我真的很困惑.. 谁能告诉我整数 int 不应该只分配 4 字节的内存,无论它是指针还是常规变量?请任何人回复或粘贴链接,以便我的困惑得到帮助。谢谢!!

标签: c pointers sizeof


【解决方案1】:

你的逻辑是,如果我写

printf("%d", 4); 

它打印 1 个十进制数字,可能存储在 1 个字节中,那么sizeof(int) 必须是 1 个字节。

号码0x7fff57e3ba240x00007fff57e3ba24 相同。仅仅因为数字恰好比类型可以存储的数字少,并不意味着它占用的空间更少。

【讨论】:

    【解决方案2】:

    即使最高有效位为零,指针仍占用 8 个字节。

    虽然可以通过消除不需要的字节来“优化”数据存储,但数据访问会变得更加复杂且效率更低。了解计算机内存中的数据对齐。

    【讨论】:

      【解决方案3】:

      前导零没有意义,因为地址是无符号的,前导 2 个字节是零,因此不打印。 您可以修改格式说明符以打印前导零。

      【讨论】:

      猜你喜欢
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 2019-07-20
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多