最近我离开学校几天了,想在C ++中做一个小程序实验来处理内存地址。
我想看到的是,如果当前正在运行的程序(让它称之为程序A)创建了一个指向堆中int对象的指针,则可以被另一个程序看到并进行修改(程序B)。
因此,对于程序A,这是我的基本代码:
// Program A
#include <iostream>
using namespace std;
int main()
{
// Pointer to an int object in the heap
int *pint = new int(15);
// Display the address of the memory in heap
cout << pint << endl;
// Display the value stored in that address
cout << *pint << endl;
return 0;
}
计划A的输出:
0x641030
15
对于程序B,我查看了如何通过此链接分配特定的内存地址: http://www.devx.com/tips/Tip/14104
程序B的代码是:
// Program B
#include <iostream>
using namespace std;
int main()
{
// assign address 0x641030 to p
int *p = reinterpret_cast< int* > (0x641030);
cout << p << endl;
cout << *p << endl;
return 0;
}
计划B的输出:
0x641030
... "Crash"
我不太明白。我期待显示来自*p
的15,但它做了我没想到的事情。
我还尝试将*p
分配给*p = 2000
之类的号码,但是当我尝试这个号码时它也崩溃了。
当我显示指针和程序A(cout << &pint;
)和程序B(cout << &p;
)的地址时,它们都显示相同的内存地址。
有谁知道究竟发生了什么?我很感兴趣但对于正在发生的事情感到困惑。另外,我可以在C ++ / C中做我想做的事吗?
**编辑** 很抱歉不提我的平台,但我目前正在使用Window 7 Professional
答案 0 :(得分:10)
简短的回答是,不同的进程使用完全不同的地址空间。如果不做更多的工作,进程B就无法从进程A读取或写入内存。
可以以特定于平台的方式执行此操作。 Win32提供WriteProcessMemory等功能,您可以直接将值戳入另一个进程的内存空间。大多数操作系统都提供共享内存功能,使用Win32可以使用内存映射文件,Unix风格通常具有某种等效的“mmap”或“shmem”功能。
答案 1 :(得分:2)
我认为大多数操作系统都是为了让你不可能(或者很难)做你想做的事情 - 让一个正在运行的程序(或进程)干扰另一个正在运行的程序的地址空间的内容(或过程)。既然你没有告诉我们你的平台,就很难对此进行分类,但我怀疑o / s是在拯救你自己。这种严格的过程分离是单用户机器上的安全功能,是多用户机器上的安全和安全功能。
当然,有许多运行并发进程的技术可以共享内存或通过消息传递交换信息。离开学校更多时间学习那些!
答案 2 :(得分:1)
查看内存映射文件或共享内存。
http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx