从另一个程序分配特定的内存地址,并更改其值

时间:2010-01-28 09:07:03

标签: c++ memory variable-assignment memory-address

最近我离开学校几天了,想在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

3 个答案:

答案 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