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

Ass*_*ets 3 c++ ram pointers memory-address

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

das*_*ght 7

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

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

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


Xen*_*oad 5

不,你会得到一个 Segmentation Fault

如果我尝试运行此代码:

int main(int argc, char *argv[]) {
    int *ptr = (int*) 0x1234;
    *ptr = 10;
}
Run Code Online (Sandbox Code Playgroud)

我会得到一个分段错误,这就是告诉你,你不能做到这一点的操作系统的方式(除非×1234已经由过程由于某些原因被分配).通常情况下,当你用指针做一些棘手的事情时它们会发生,但它们也可能发生在其他地方.

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

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