3

最近、私は数日間学校を休んでおり、メモリーアドレスを扱う C++ で小さなプログラムの実験をしたいと思っていました。

私が見たかったのは、ヒープ内のintオブジェクトへのポインターを作成した現在実行中のプログラム(プログラムAと呼びましょう)が、別のプログラムによって表示され、変更できるかどうかです(プログラム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

ほとんどのオペレーティングシステムは、実行しようとしていることを実行できない(または非常に困難にする)ように設計されていると思います。ある実行中のプログラム(またはプロセス)が別の実行中のプログラム(またはプロセス)のアドレス空間の内容に干渉する)。プラットフォームを教えてくれないので、これについて分類するのは難しいですが、o/sがあなたをあなた自身から救っているのではないかと思います。このプロセスの厳密な分離は、シングルユーザーマシンの安全機能、マルチユーザーマシンの安全およびセキュリティ機能です。

もちろん、メモリを共有したり、メッセージパッシングによって情報を交換したりする並行プロセスを実行するための多くの手法があります。学校を休んで、それらを勉強してください!

于 2010-01-28T09:13:45.260 に答える
1

Memory Mapped Files または Shared Memory を見てください。

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

于 2010-01-28T09:22:15.343 に答える