【发布时间】:2009-09-24 01:52:19
【问题描述】:
在 C 语言中,我们可以在变量前放置“&”来计算该变量的地址。 我有一台 32 位机器。每当我在控制台中打印地址时,控制台都会显示一个 7 位基数为 10 的数字。我只想知道这个数字(10^7)与 32 位机器有什么关系。 (2^32) 谢谢
【问题讨论】:
标签: c pointers memory-address
在 C 语言中,我们可以在变量前放置“&”来计算该变量的地址。 我有一台 32 位机器。每当我在控制台中打印地址时,控制台都会显示一个 7 位基数为 10 的数字。我只想知道这个数字(10^7)与 32 位机器有什么关系。 (2^32) 谢谢
【问题讨论】:
标签: c pointers memory-address
您可能应该将其打印为指针或十六进制值:
printf ("address = %p\n", &variable);
printf ("address = %x\n", &variable);
这将为您提供最多 8 位的十六进制数(对于您的 32 位地址空间)。
一个 32 位数字的范围从 0000000016 到 FFFFFFFF16(0 到 4,294,967,295 十进制),所以它可能高达十进制数字。
你只得到一个 7 位以 10 为基数的数字的原因是因为你的变量离地址空间的顶部很远。
【讨论】:
变量在内存中的位置与它的存储类型(即堆栈与静态数据)以及可执行文件如何将这些段映射到内存有关。
尝试静态分配一个包含 2500 万个整数的数组,并获取最后一个整数的地址 .. 打赌你会看到一个数字可能接近 100,000,000。 (不过,不要太过分了,除非你想看看当你的系统用完内存时会发生什么=)
你可以的
printf("0x%08x", &whatever)
.. 获取完整的 8 个十六进制数字,左侧填充零。
“0x”部分并非绝对必要,但如果/当您在三周后再次运行程序并且您碰巧正在查看的十六进制数字中没有 A-F 字符时,它有助于避免混淆它。
【讨论】:
%p 修饰符,它专门用于指针(以及扩展的地址)。
最大 32 位数字,十六进制的 0xFFFFFFFF,转换为 4294967296(以 10 为底),因此您需要 10 个十进制数字来显示最大 32 位数字。较小的数字将使用较少的数字(0x1 只需要 1)。
【讨论】: