Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针是指物理内存还是虚拟内存?_C_Pointers_Memory_Virtual - Fatal编程技术网

C 指针是指物理内存还是虚拟内存?

C 指针是指物理内存还是虚拟内存?,c,pointers,memory,virtual,C,Pointers,Memory,Virtual,我最近了解到,计算机程序实际上并没有利用物理内存的地址。相反,我知道物理内存被操作系统“隐藏”到应用程序中 我的问题来了: 指针是返回物理内存还是虚拟内存的地址 如果我执行下面的代码,我会得到一个十六进制形式的地址。它只是一个由操作系统随机分配的数字吗?而且,我发现数组中元素的地址是连续分配的。这是否意味着数组在RAM中实际上是“线”形式的,或者它们可能被分配到稀疏区域,而操作系统只是假装程序员 int num = 3; int arr[3]; printf("address of num:

我最近了解到,计算机程序实际上并没有利用物理内存的地址。相反,我知道物理内存被操作系统“隐藏”到应用程序中

我的问题来了: 指针是返回物理内存还是虚拟内存的地址

如果我执行下面的代码,我会得到一个十六进制形式的地址。它只是一个由操作系统随机分配的数字吗?而且,我发现数组中元素的地址是连续分配的。这是否意味着数组在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]);

这取决于操作系统。但大多数情况下(在大多数操作系统上),它们都是逻辑地址。 有虚拟内存、分页等操作系统机制用于地址转换。这样做通常是为了确保不允许程序覆盖部分内存。 如果您在没有操作系统来处理虚拟地址的裸机内核上运行此操作。它将是物理地址。如果在操作系统上作为应用程序运行,您将获得虚拟地址。

在所有现代操作系统(Windows、Linux、BSD等)中,用户空间应用程序中的所有地址都是虚拟地址。例外情况是某些RTOS或其他定制裸机应用程序

虚拟地址不一定是随机的,但从硬件的角度来看,它们是任意的。内核通常会决定为给定映射请求分配的虚拟地址空间,有时会考虑用户空间请求。当使用ASLR之类的东西时(这在当今很常见),地址会被有意地随机分配

这是否意味着数组在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]);
两者都有。操作系统创建内存页的物理到虚拟映射,而不是单个地址。页面大小因架构而异,但通常为4kib


因此,如果您有一个1kib数组(其起始地址至少为1kib对齐),那么它在物理上是连续的。然而,一个16kib的数组可能分散在4个互不接近的页面上。

实际上,这取决于具体情况。如果您使用的是没有虚拟内存的操作系统,或者您正在编写内核代码的(部分),那么它将指向物理地址。如果您正在编写一个将在操作系统上运行的应用程序,也就是说,在用户模式下,并且操作系统使用虚拟内存,那么它将指向一个虚拟地址。有关更多信息,请参阅程序使用的指针的可能副本,因此它必须具有程序所看到的地址。如果系统已为程序创建了虚拟地址空间,则程序将使用虚拟地址。是否确保1KB阵列是连续的?它能在一页中开始并在下一页中继续吗?@Broman“一个1kib数组(其起始地址至少为1kib对齐)”--假设4kib页面大小,如果1kib块是1kib对齐的,它将正好适合该页面上四个“插槽”中的一个。非常感谢!!这真的帮了我的忙:)