gpt4 book ai didi

c - 指针指的是物理内存还是虚拟内存?

转载 作者:太空狗 更新时间:2023-10-29 16:05:19 24 4
gpt4 key购买 nike

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

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

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

Does this mean that an array is actually in a 'line' form in the RAM, or is it possible for them to be assigned in sparse regions and the OS merely fakes the programmer?

两者都有。操作系统创建内存页面的物理到虚拟映射,而不是单个地址。页面大小因架构而异,但通常为 4 KiB。

因此,如果您有一个 1 KiB 的数组(其起始地址至少对齐 1 KiB),它将在物理上是连续的。然而,一个 16 KiB 的数组可能分散在 4 个页面中,这些页面彼此之间的距离很远。

关于c - 指针指的是物理内存还是虚拟内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55415778/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com