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



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

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

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

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

不,你会得到一个Segmentation Fault

如果我尝试运行此代码:

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

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

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

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

最新更新