【发布时间】:2018-07-12 12:40:35
【问题描述】:
给定以下 C 代码:
void *ptr;
ptr = malloc(100);
printf("Address: %p\n", ptr);
在 Ubuntu 64 位中使用 GCC 4.9 编译此代码并运行它时,输出类似于:
Address: 0x151ab10
0x151ab10 的值似乎是一个合理的数字,因为我的机器有 8 GB 的 RAM,但是当在 Mac OS X 64 位中使用 GCC 4.9 编译相同的代码并运行它时,它会给出类似这样的输出:
Address: 0x7fb9cb43ed30
...这很奇怪,因为0x7fb9cb43ed30 远高于 8 GB 的 RAM。在 Mac OS X 中是否需要进行某种位掩码才能打印出ptr 的真实地址?
【问题讨论】:
-
我假设地址映射到虚拟内存中的某个位置。为什么你仍然需要“真实”地址?你打算用它做什么?
-
在现代操作系统中,内存地址是虚拟的,所以你的地址绝对不是“奇怪的”。
-
尝试同时运行其中两个程序(添加 sleep(666) 或 getchar() 以防止它们过早退出)。他们可以有相同的地址!
-
那些操作系统上的 C 指针不是真实地址,它们是虚拟地址。 Linux 和 MacOS 分配用户空间的虚拟地址的方式不同,因此这些数字并不令人惊讶。相关:stackoverflow.com/questions/5203748/…