我可以读取任何内存值吗?

时间:2014-04-23 17:22:38

标签: c++ pointers memory

我只是想知道我是否可以通过提供它的地址(在我的情况下是随机的)来读取内存中的任何值。我知道它不起作用,但我试过了:

int e = 10;
int* p = &e;
p = 0x220202;

这甚至都不会编译。那么,有没有办法用C ++或任何其他编程语言在计算机的内存中读取内容。

5 个答案:

答案 0 :(得分:7)

  

那么,有没有办法在我的计算机内存中读取内容

如果您参考计算机的整个内存:,则不能 - 至少在现代桌面/主流操作系统上不行。您只能从进程的地址空间中读取内存。

看看virtual memory。简而言之:您的指针指的是“虚拟”地址,而不是真正的地址。计算机中的特殊硬件会将这些地址转换为实际地址。操作系统定义了必须如何完成映射。这样,每个进程都拥有自己唯一的地址空间。只要操作系统的调度程序切换到另一个进程,它就会告诉硬件切换到相应的转换表。由于这种机制,您可以在进程之间获得隔离,这是一件非常好的事情:如果编程不良的应用程序访问无效内存,则只有相关进程会崩溃,而系统的其余部分不会受到影响。

考虑一下:如果没有这种隔离,你可能需要在每次测试一些指针运算时重新启动计算机。

答案 1 :(得分:3)

您可以读取操作系统分配给您的流程的任何值。

如果您的示例需要在分配之前将整数强制转换为指针:

p = (int*) 0x220202; // now p points to address 0x220202
int value = *p;  // read an integer at 0x220202 into 'value'

请注意,不能访问地址 - 某些区域是只读的,在某些平台上,指针也必须正确对齐(即指向32位整数的指针应在4字节边界上对齐)。

答案 2 :(得分:0)

如果将p = 0x220202替换为p = (int *)0x220202,您的代码将会编译。仅通过提供地址,您将无法访问任何内存。您只能访问此进程的地址空间内的内存。这意味着您的操作系统将阻止您访问另一个exe的内存。

答案 3 :(得分:0)

您必须将0x220202投射到int*

写:

p = (int*)0x220202 ;

这将编译,但在运行程序时很可能会崩溃。

答案 4 :(得分:0)

由于此内存不在程序范围内,您将收到运行时错误

#include <iostream>
using namespace std;

int main() {
    int * p = (int *) 0x220202;
    int i = *p;
    cout << i;
    return 0;
}