如果2个程序正在运行,并且一个程序在内存地址存储一个数字,并且如果我知道该内存地址,并将其硬编码到第二个程序并打印出该地址的值,它实际上会得到信息? C ++是否允许程序访问存储在RAM中的任何数据,无论它是否属于程序的一部分?
答案 0 :(得分:7)
在没有虚拟内存管理且没有地址空间保护的系统上,这将起作用。从C标准的角度来看,它将是未定义的行为,但它会产生您期望的行为。
坏消息是,目前使用的大多数计算机系统都具有虚拟内存管理和地址空间保护。这意味着内存地址(程序看到的数字)在系统中不是唯一的。系统中的每个进程都可能看到相同的地址,但它会在任何给定的时刻映射到计算机上的不同物理地址。操作系统和硬件将为每个进程创建错觉,它可以控制该内存地址,而实际上进程的内存空间不会重叠。
好消息是,现代操作系统支持某种形式的共享内存访问,这意味着一个进程可以与其他进程共享一段内存,并通过读取和写入该共享段来交换数据。
答案 1 :(得分:5)
不,你得到Segmentation Fault
如果我尝试运行此代码:
int main(int argc, char *argv[]) {
int *ptr = (int*) 0x1234;
*ptr = 10;
}
我发现了分段错误(除非因某些原因由进程分配了0x1234),这是操作系统告诉您不允许这样做的方式。通常情况下,当你用指针做一些棘手的事情时,它们就会发生,但它们也可能发生在其他地方。
默认情况下,他们会立即终止您的程序,除非您在调试器中运行或已注册信号处理程序以继续您的程序
编辑:如果你真的想要,有办法让操作系统让你这样做,由调试器等使用。