3

最近我放学了几天,想用 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"

我不太明白。我期待 15 的显示*p,但它做了我没想到的事情。

我也尝试分配*p一个类似的数字,*p = 2000但是当我尝试这样做时它也崩溃了。

此外,当我显示指针和程序 A ( cout << &pint;) 和程序 B ( cout << &p;) 的地址时,它们都显示了相同的内存地址。

有谁知道到底发生了什么?我很感兴趣,但对正在发生的事情感到困惑。另外,我可以做我在 C++/C 中尝试的事情吗?

** 编辑 ** 抱歉没有提及我的平台,但我目前使用的是 Window 7 Professional

4

3 回答 3

10

简短的回答是不同的进程使用完全不同的地址空间。如果不做更多的工作,进程 B 就无法从进程 A 读取或写入内存。

可以以特定于平台的方式执行此操作。Win32 提供了诸如WriteProcessMemory 之类的函数,您可以在其中直接将值插入另一个进程的内存空间。大多数操作系统都提供共享内存功能,在 Win32 中,您可以使用内存映射文件,而 Unix 风格通常具有某种等效的“mmap”或“shmem”功能。

于 2010-01-28T09:10:53.877 回答
2

我认为大多数操作系统的设计目的是使您无法(或非常困难)做您想做的事情——让一个正在运行的程序(或进程)干扰另一个正在运行的程序(或进程)的地址空间内容)。由于您没有告诉我们您的平台,因此很难对此进行分类,但我怀疑操作系统正在将您从自己手中拯救出来。这种严格的进程分离是单用户机器上的安全特性,是多用户机器上的安全和安保特性。

当然,有许多技术可以运行并发进程,这些进程可以共享内存或通过消息传递交换信息。多花点时间去学校学习吧!

于 2010-01-28T09:13:45.260 回答
1

查看内存映射文件或共享内存。

http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx

于 2010-01-28T09:22:15.343 回答