- ベストアンサー
変数のアドレスの値
2つの実行ファイルがあってどちらも起動しています。 どちらもテスト用で作ったスケルトン程度のものです。 2つの実行ファイルをA,Bと呼ぶことにします。 Aのウインドウハンドル(HWND型)の値と Bのウインドウハンドル(HWND型)の値が同じであるということはありえませんよね? AにもBにもソースには int i; が書いてあります。 &iの値がAとBとで同じになることはありえますか?
- みんなの回答 (16)
- 専門家の回答
質問者が選んだベストアンサー
(以下、アプリはプロセスのことを指しています。) 別のウィンドウですからアプリAとアプリBでHWNDは異なる値になります。 ---- アプリAとアプリBは別のアプリですから別のアドレス空間を持っています。 同じコンパイラで同じ設定でコンパイルした場合、別のアプリでも各アプリから見た変数のアドレスが同じになることがあります。 しかし、アドレスが同じでもアプリごとに別のアドレス空間を持っているので、メモリ上の実際の位置はまったく異なります。 (実際の住所で、番地が同じでも市町村や大字が違ったらまったく違う家を指しているのと同じことです。) 同じアドレス空間だったら大変なことにです。 他のアプリが自分のアプリのデータを書き換えてしまってめちゃくちゃなことになってしまいます。 各アプリはまともに動作しないでしょう。
その他の回答 (15)
- mikaemi
- ベストアンサー率50% (33/65)
「iの識別がしたいので、…プロセスIDと&iをペアにすれば、必ずiの区別はできますか?」といっているところの区別とは何を意味するのか定かではないですが、i が共有メモリなんかじゃなければ、実体は違いますね。共有メモリで実体が同じでも論理アドレスは違うこともあるでしょう。 でもまあ、別プロセスなら、(プロセスID,論理アドレス値)の見た目の値は違うんじゃないでしょうか。。。 そもそも、なんのためにそういうことをしたいのか、わからないんですけどね^^;
お礼
AもBも起動している時にこれから作るデバッガが、 「アドレス値5000のint変数の値は8です」 としか表示しないなら区別できないでしょ。 AのiもBのiも&iは5000なんだから。
- zwi
- ベストアンサー率56% (730/1282)
物理アドレスの表示ですか。 デバイスドライバなら、DMAなどのために物理アドレスが必要なので変換できる仕組みは持っていますが、ユーザーアプリでは簡単に呼び出せないでしょうね。 98→2000→XP→Vistaと厳しさを増してる気がしますので、OS毎にできる出来ないも違う気がしますね。
補足
物理アドレスというのはここまでに出て来てているアドレス空間値ですか?
- mikaemi
- ベストアンサー率50% (33/65)
「アドレス空間値2000で&iが3000のiの値は7です」などとなんのためにしたいのかわかりませんが^^ & 演算子で取得できるのは論理アドレスですしね。物理アドレスって、C言語の範囲では取得できないでしょう。 「プロセスID xxxx の論理アドレス yyyy の i の値は z です」ならできますけれど。。。 「アプリ=プロセス」ではないでしょう。shirayukix さんは説明が面倒なので、その回答の中でそのように仮定してるだけでしょ^^;
補足
iの識別がしたいので、アドレス空間値ではなくてプロセスIDと&iでもよいです。 プロセスIDと&iをペアにすれば、必ずiの区別はできますか?
- zwi
- ベストアンサー率56% (730/1282)
ウインドウハンドル(HWND型)はOSが管理している情報なので別の値になります。 変数のアドレスは、同じになる可能性があります。1つのプログラムを同時に起動した場合、同じタイミングで同じ変数は同じアドレスを指します。自動変数(ローカル変数)はスタック上に作られますので、関数コールの経路が違えばアドレスは変わってしまいます。 変数のアドレスが同じアドレスを指すのは、仮想記憶という仕組みがプロセス毎に同じ論理アドレスのメモリ空間を用意するためです。実際の物理メモリアドレスは違っていてもプログラムから見たアドレス(論理アドレス)は同じになります。 通常私たちが物理アドレスを意識することはありません。OSがすべてを管理してます。論理アドレスが同じなのに書き換えても影響が別のプロセス(プログラム)に出ないのは、物理アドレスが違っているためです。
- ushioni
- ベストアンサー率24% (14/58)
同じにしたければ、大域変数としてAのファイルで宣言し、 Bのファイルからはexternで宣言します。 staticな変数にすると、必ず違うアドレス値になります。 自動変数だった場合は、スタックが利用されるでしょうから 関数を呼ぶタイミングでアドレスは変わります。 また、int iの場合は最適化によってレジスタに割り当てられる 可能性や他の処理に溶け込んで「これがiだ」と言えなく なってしまう場合もあります。
お礼
回答の内容が難しくて分かりませんでした。
- 1
- 2
補足
アプリ==プロセス ということは以前からだいたいそのように思っていました。 今、Aの&iとBの&iを同じにして、それぞれのiに別の値を入れることに成功しました。 &iの値だけではWindowsの中のiが区別できないので、&iに加えてアドレス空間も使って2つのiを識別するわけですね? アドレス空間の値を取得する方法はありませんか? アドレス空間値2000で&iが3000のiの値は7です、というようなMessageBox()を出してみたいのですが。