物理内存地址和指针地址不相同
Posted
技术标签:
【中文标题】物理内存地址和指针地址不相同【英文标题】:Physical memory address and pointer address is not same 【发布时间】:2020-06-17 19:24:17 【问题描述】:您好,我正在使用 c++ 指针,还使用来自 Microsoft 的名为 RamMap 的程序来检查内存物理地址。
但我发现c++中的变量指针的地址在RamMap的列表中不存在
例如:
#include <cstdlib>
#include <iostream>
#include<conio.h>
using namespace std;
int main()
string var1="var1";
string * foo = &var1;
cout<<foo;
getch();
return 0;
它返回 0x61fde0
之后我查看了 RamMap 并搜索了这个地址但找不到任何东西
谁能帮帮我?我很困惑,我注意到每次重新运行程序时我的指针地址都不会改变
【问题讨论】:
我怀疑 RamMap 是否能够解决操作系统为您的程序分配的内存之外的任何问题。 如果这很重要,那么您可以通过输出其地址来映射每个变量,例如int array[10] = 1,2,3,4,5,6,7,8,9,0;
然后 printf( memory: %p, %p, ..., %p\n", array[0], array[1], ..., arraay[9]);
@MohammadAnsari 例如见Virtual Memory or Physical Memory。物理内存地址可以在程序运行时更改,即使虚拟地址在进程的生命周期内(当然)保持不变。
@ryyker 你的意思是printf( memory: %p, %p, ..., %p\n", &array[0], &array[1], ..., &array[9]);
?已添加&
@dxiv 感谢您的评论,我认为这是我需要的答案,它不是实际的内存,它是虚拟内存
【参考方案1】:
每个进程都有自己的由逻辑地址组成的内存视图。它们可能对应也可能不对应物理地址,即实际 RAM。但即使它们确实对应,值仍然不同。
如果不是这样,很多事情都会出错。但最明显的一个可能是物理内存碎片的问题。想象一下,如果一个进程请求分配一个 4MB 的内存块并且有大量可用的 RAM,但没有连续的 4MB 块。哎哟。
【讨论】:
ASLR 与物理地址 1:1 映射的几率基本为零。以上是关于物理内存地址和指针地址不相同的主要内容,如果未能解决你的问题,请参考以下文章