Mar*_*aux 5 c++ memory pointers
如果我有一些像这样的愚蠢代码:
int nBlah = 123;
int* pnBlah = &nBlah;
pnBlah += 80000;
*pnBlah = 65;
Run Code Online (Sandbox Code Playgroud)
我可以更改另一个应用程序的内存吗?
你知道,你告诉我这是邪恶的.但我只是感兴趣.
这不是简单的尝试.我不知道会发生什么.
谢谢
Bri*_*eal 15
在C++术语中,这是未定义的行为.实际发生的情况取决于许多因素,但最重要的是它取决于您使用的操作系统(OS).在现代内存管理的操作系统上,您的应用程序将以"分段故障"(实际术语取决于操作系统)终止,以尝试访问进程地址空间之外的内存.然而,有些操作系统没有这种保护,你可以毫不犹豫地戳破并破坏属于其他程序的东西.如果您的代码位于内核空间内,例如在设备驱动程序中,通常也会出现这种情况.
不,这不是那么简单.:)
现代操作系统使用虚拟内存.
每个进程都提供一个完整的虚拟地址空间.
每个进程都有自己的所有地址"视图"(在32位系统上从0x00000000到0xffffffff).进程A和B都可以写入相同的地址,而不会影响彼此,因为它们不访问物理内存地址,而是访问虚拟地址.当进程尝试访问虚拟地址时,操作系统会将其转换为其他物理地址以避免冲突.
本质上,操作系统会跟踪每个进程的分配内存页表.它跟踪已分配给进程的地址范围,以及它们映射到的物理地址.如果进程尝试访问未分配给它的地址,则会出现访问冲突/分段错误.如果您尝试访问该地址被分配给你的过程中,你会得到你自己的数据.因此,只需键入"错误"地址就无法读取其他进程数据.
在现代操作系统下,您无法访问实际内存,而是访问4gb(32位以下)的虚拟内存空间.底部2gb供您使用,顶部2gb为操作系统保留.
这并不反映RAM中的实际内存字节.
每个应用程序都获得相同的虚拟地址空间,因此没有直接的方式来访问另一个进程的内存空间.