物理内存地址和指针地址不相同

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", &amp;array[0], &amp;array[1], ..., &amp;array[9]);?已添加&amp; @dxiv 感谢您的评论,我认为这是我需要的答案,它不是实际的内存,它是虚拟内存 【参考方案1】:

每个进程都有自己的由逻辑地址组成的内存视图。它们可能对应也可能不对应物理地址,即实际 RAM。但即使它们确实对应,值仍然不同。

如果不是这样,很多事情都会出错。但最明显的一个可能是物理内存碎片的问题。想象一下,如果一个进程请求分配一个 4MB 的内存块并且有大量可用的 RAM,但没有连续的 4MB 块。哎哟。

【讨论】:

ASLR 与物理地址 1:1 映射的几率基本为零。

以上是关于物理内存地址和指针地址不相同的主要内容,如果未能解决你的问题,请参考以下文章

虚拟内存或物理内存

linux内核物理内存空间分布

函数指针:物理或虚拟地址

内存管理中的三种地址

物理内存虚拟内存bufferscached共享内存swap

linux内存池能分配连续物理内存吗