C程序能否访问并修改分配给其他程序的堆内存地址?
结论
程序2完全无法访问到程序1分配的对应堆内存,在绝大多数桌面/服务器操作系统上运行程序2还会直接崩溃。
核心原因
- 现代主流操作系统(Linux、Windows、macOS等)都采用虚拟内存隔离机制:每个运行的进程拥有独立的私有虚拟地址空间,程序代码里打印、使用的所有地址都是虚拟地址,不是真实的物理内存地址。
- 程序1打印的地址仅在程序1自己的地址空间内有效:操作系统会为每个进程维护独立的页表,负责把虚拟地址转换为物理内存地址,程序1的虚拟地址映射关系对程序2完全不生效。
- 程序2拿到相同数值的地址后,访问的是自己地址空间里的对应位置:要么这个地址在程序2中没有被分配映射,直接触发段错误/内存访问违规崩溃;就算这个地址刚好在程序2中有映射,对应的物理内存也和程序1的堆内存没有任何关联,既读不到程序1写入的0~99的数值,也无法修改程序1的内存数据。
补充说明
只有部分没有虚拟内存机制的嵌入式实时操作系统,所有进程直接访问物理内存地址时,才有可能实现跨进程的地址直接访问,这种场景在普通消费级、服务器级设备上不存在。
另外你提供的程序2本身存在语法问题:scanf("%d",&address)后缺少分号,且在64位系统下用int类型存储地址本身就会出现地址截断问题,就算在无虚拟内存的系统上也无法正常运行。
内容的提问来源于stack exchange,提问作者Zaratruta
相关产品推荐
相关产品推荐

