【发布时间】:2019-08-20 07:07:56
【问题描述】:
我最近了解到计算机程序实际上并没有使用物理内存的地址。相反,我理解物理内存被操作系统“隐藏”到应用程序中。
我的问题来了: 指针返回物理内存地址还是虚拟内存地址?
如果我执行下面的代码,我会得到一个十六进制形式的地址。它只是操作系统随机分配的一个数字吗?而且,我发现数组中元素的地址是连续分配的。这是否意味着一个数组实际上是在 RAM 中的“行”形式,或者它们有可能被分配到稀疏区域并且操作系统只是假装程序员?
int num = 3;
int arr[3];
printf("address of num: 0x%0x \n", &num);
printf("&arr[0]: 0x%0x \n", &arr[0]);
printf("&arr[1]: 0x%0x \n", &arr[1]);
printf("&arr[2]: 0x%0x \n", &arr[2]);
【问题讨论】:
-
实际上,这取决于。如果您使用的是没有虚拟内存的操作系统,或者您正在编写(部分)内核代码,它将指向物理地址。如果您正在编写一个将在操作系统之上运行的应用程序,也就是说,在用户模式下并且操作系统使用虚拟内存,它将指向一个虚拟地址。更多信息请参见stackoverflow.com/questions/26585788/…
-
程序使用了一个指针,因此它必须具有程序所见的地址。如果系统为程序创建了虚拟地址空间,则程序使用虚拟地址。