我可以使用我的C ++程序之外的随机内存地址访问随机数据

时间:2014-12-18 04:44:27

标签: c++ pointers ram memory-address

如果2个程序正在运行,并且一个程序在内存地址存储一个数字,并且如果我知道该内存地址,并将其硬编码到第二个程序并打印出该地址的值,它实际上会得到信息? C ++是否允许程序访问存储在RAM中的任何数据,无论它是否属于程序的一部分?

2 个答案:

答案 0 :(得分:7)

在没有虚拟内存管理且没有地址空间保护的系统上,这将起作用。从C标准的角度来看,它将是未定义的行为,但它会产生您期望的行为。

坏消息是,目前使用的大多数计算机系统都具有虚拟内存管理和地址空间保护。这意味着内存地址(程序看到的数字)在系统中不是唯一的。系统中的每个进程都可能看到相同的地址,但它会在任何给定的时刻映射到计算机上的不同物理地址。操作系统和硬件将为每个进程创建错觉,它可以控制该内存地址,而实际上进程的内存空间不会重叠。

好消息是,现代操作系统支持某种形式的共享内存访问,这意味着一个进程可以与其他进程共享一段内存,并通过读取和写入该共享段来交换数据。

答案 1 :(得分:5)

不,你得到Segmentation Fault

如果我尝试运行此代码:

int main(int argc, char *argv[]) {
    int *ptr = (int*) 0x1234;
    *ptr = 10;
}

我发现了分段错误(除非因某些原因由进程分配了0x1234),这是操作系统告诉您不允许这样做的方式。通常情况下,当你用指针做一些棘手的事情时,它们就会发生,但它们也可能发生在其他地方。

默认情况下,他们会立即终止您的程序,除非您在调试器中运行或已注册信号处理程序以继续您的程序

编辑:如果你真的想要,有办法让操作系统让你这样做,由调试器等使用。