【问题标题】:Understanding hexadecimal output from C pointers了解 C 指针的十六进制输出
【发布时间】:2022-01-19 19:13:00
【问题描述】:

我在 CodeBlocks 中运行了一些 C 代码并打印了内存地址。结果是 16 个字符的十六进制。这是 3:14:05 来自 freeCodeCamp 的关于 C 的 youtube 教程中的一个练习。 https://www.youtube.com/watch?v=KJgsSFOSQv0&list=FLWOrEQtSUgIDNHMCI3yfvnQ&index=4 youtube 主持人想出了一个 8 个字符的十六进制结果。这是否意味着我的系统内存是演示者的两倍?我的 Windows 10 笔记本电脑有 32 GB 的内存。

编辑,我被指示发布相关的 C 代码,在这里。 主函数() {

int age = 30;
int * pAge = &age;
double gpa = 3.4;
double * pGpa = &gpa;
char grade = 'A';
char * pGrade = &grade;



printf("age's memory address: %p\n", &age);
return 0;

}

【问题讨论】:

  • 这些是虚拟地址而不是物理地址。它没有说明 RAM/物理内存的数量。
  • 您需要将相关代码以文本形式发布到本站这里。
  • 问题应该是自包含的,而不仅仅是指向某些外部资源的指针
  • %p 的输出取决于平台和平台上指针的大小。在 32 位平台上,您最有可能得到类似 00ea1252 的东西,在 64 位平台上,您最有可能得到类似 00048a7b00051252 的东西。所以基本上这意味着演示者在 32 位平台上,而你在 64 位平台上。
  • 你需要反思你的直觉。如果一个数字 X 的位数是数字 Y 的两倍,那并不意味着它的大小是数字的两倍。 200 是 100 的两倍,但它们需要相同的位数。一个六位数可以大到 999,999,一个三位数小于一千。所以用六位数,你可以表达比两倍多的可能性。这是经典的快速思考/缓慢思考错误之一,q.v.丹尼尔·卡尼曼。

标签: c pointers hex


【解决方案1】:

较早的 Windows 版本具有 32 位地址总线。较新的版本支持 64 位数据访问和 64 位地址总线(假设 CPU 也是 64 位)。它与您拥有多少物理 RAM 完全无关。虽然将旧 PC 扩展至超过 4GB 的可寻址内存是有问题的,但这是迁移到 64 位的主要原因之一。

【讨论】:

    猜你喜欢
    • 2014-11-20
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2012-03-13
    • 1970-01-01
    • 2013-01-11
    • 2017-06-08
    相关资源
    最近更新 更多