• ベストアンサー

変数のアドレスの値

2つの実行ファイルがあってどちらも起動しています。 どちらもテスト用で作ったスケルトン程度のものです。 2つの実行ファイルをA,Bと呼ぶことにします。 Aのウインドウハンドル(HWND型)の値と Bのウインドウハンドル(HWND型)の値が同じであるということはありえませんよね? AにもBにもソースには int i; が書いてあります。 &iの値がAとBとで同じになることはありえますか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

(以下、アプリはプロセスのことを指しています。) 別のウィンドウですからアプリAとアプリBでHWNDは異なる値になります。 ---- アプリAとアプリBは別のアプリですから別のアドレス空間を持っています。 同じコンパイラで同じ設定でコンパイルした場合、別のアプリでも各アプリから見た変数のアドレスが同じになることがあります。 しかし、アドレスが同じでもアプリごとに別のアドレス空間を持っているので、メモリ上の実際の位置はまったく異なります。 (実際の住所で、番地が同じでも市町村や大字が違ったらまったく違う家を指しているのと同じことです。) 同じアドレス空間だったら大変なことにです。 他のアプリが自分のアプリのデータを書き換えてしまってめちゃくちゃなことになってしまいます。 各アプリはまともに動作しないでしょう。

hubllk
質問者

補足

アプリ==プロセス ということは以前からだいたいそのように思っていました。 今、Aの&iとBの&iを同じにして、それぞれのiに別の値を入れることに成功しました。 &iの値だけではWindowsの中のiが区別できないので、&iに加えてアドレス空間も使って2つのiを識別するわけですね? アドレス空間の値を取得する方法はありませんか? アドレス空間値2000で&iが3000のiの値は7です、というようなMessageBox()を出してみたいのですが。

その他の回答 (15)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.16

>それで結論はプロセスIDと&iで完全に識別できるんですか? やればわかることをしないでなぜ聞く。

noname#39970
noname#39970
回答No.15

逸脱な回答 >という所まで話が進んでいる 本来の質問ではない質問に変化している。 質問に書かれている事に関する疑問がとけたのなら「識別するにはどうしたら良いか」という質問を別途すべき …なんだけどもう結構進んじゃってるしそのままでも良いのかな… http://www.google.co.jp/search?q=c++%20%E7%89%A9%E7%90%86%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E7%9F%A5%E3%82%8B&hl=ja&lr=lang_ja 他の人が言う通り物理アドレスを得るには至らないみたいね。 区別したいという事はそのプロセスを監視するプロセスが有るのかな? そうでないなら他の人が書いてる通り「考えなくて良い」と思う。 監視プロセス(または類似プロセス)が有るというのならプロセスIDと&iででしか識別する方法は無いね。 同じプロセスで別スコープの同名変数参照に関して調べたらヒントになるかもしれない。 http://www.google.co.jp/search?q=c%20%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97&hl=ja&lr=lang_ja

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.14

>&iの値がAとBとで同じにして、違う値を入れることに成功した これが判ってれば、アドレス空間の意味の理解は直ぐ出来るはず。 >知りたいのはアドレス空間という言葉の意味を知り、 これはさっきの回答のとおり、Wikipediaでも調べてみれば、 プロセス空間の論理アドレス空間と物理メモリに対する、 物理アドレス空間の違いがきちんとわかるはずですが。。。 質問を理解するの大変なのは質問の仕方が悪いからだと 思いますが。。。今回の事だって、最初から >知りたいのはアドレス空間という言葉の意味を知り、 >「アドレス空間の値2000でアドレスの値が3000のiの値は7です」 >というようなMessageBox()を出すのが知りたいんですよ。 と書けば良かっただけのこと。 >頭のいい人はこの情報からさらに深い部分を読みとってくれる。 それをさせるのが質問を理解するのが苦手だと 言わせているのではないのですか?たとえ些細なことであっても、 例えば「HWNDと書いたから、OSはWindowsだということがわかるだろう」 などと安易に考えてはいけません。わからない人も居るわけですから それはあなたがきちんと明記すべきことです。 >アドレス空間とかプロセスIDの情報を付ければ確実に識別できるのか 物理アドレスを取ることはC/C++では難しいこと、 そして論理アドレスはプロセスに対して割り当てられる為 ある程度のアドレスが重なることは既に前の回答から判っているようなので、 アドレス空間に対する情報を付加するのは現実味は無いと思います。 プロセスIDであれば、たとえ同じバイナリを実行しても、 違うものが割り当てられるはずなので大丈夫のはず。 ただしOSによってプロセスIDの振り方が異なり、Windowsの場合は 未使用になったプロセスIDから埋めていくような動きがあったはずなので 一度終了したプロセスIDはきちんと管理して次に備えておく必要があるというくらいでしょう。 Linuxは小さいほうから順にMAXまで行くとまた最初に戻る #逆だったかも

hubllk
質問者

お礼

結論はプロセスIDと&iで完全に識別できるんですか?

noname#39970
noname#39970
回答No.13

なんか荒れ気味・・・ >&iの値がAとBとで同じになることはありえますか? ありえる。 他の解答にもあるけれど「絶対位置」ではないのでこの値が同じでも場所は同じではない。 (絶対位置も同じにする方法は有るがそれは他の人が書いてる) ・東京都新宿区新宿1丁目 ・埼玉県さいたま市大宮区仲町1丁目 確かにどっちも「1丁目」なんだけど絶対位置で見ると全然別の場所。 実行Aの見てる場所(東京都新宿区新宿)と実行Bの見てる場所(埼玉県さいたま市大宮区仲町)は別々だが「1丁目」という値だけ取り出す(&i)と同じに見える。

hubllk
質問者

お礼

&iの値がAとBとで同じにして、違う値を入れることに成功したって既に書きましたよ。 今知りたいのは、&iではこのように識別できないことがたまにあるから、アドレス空間とかプロセスIDの情報を付ければ確実に識別できるのか、という所まで話が進んでいるんですよ。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.12

頭の中でデバッガを作っていると掲示板に 書いたつもりにでもなってたんでしょうか? あなたが何を作っているかなんて、答える人にとっては、 どうでもいいことなんだから、自分がなにをしようとしてるか くらいは書かないと気づいてもらえませんよ? #ある意味わかったらキモイと思いませんか? >アドレス空間値なんて用語は無い これはその通りだと思いますが。。。? アドレス空間という用語があり、アドレス空間での値という意味でなら 通るかもしれませんが、用語としての認識は無いも同然でしょう。 アドレス空間が何なのか知りたいなら、Wikipediaでも調べたほうが、 ここの人をあまり信用していないあなたに説明するよりは遥かに 効果的でしょう。(このくらいは自分で調べられるだろうし) http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E7%A9%BA%E9%96%93 >「アドレス値5000のint変数の値は8です」 >としか表示しないなら区別できないでしょ。 >AのiもBのiも&iは5000なんだから。 そもそも、コンパイルされた後の実行中のプロセスに iなんて識別子が残ってる訳が無いんだから。。。 それはソースコードがあって始めてわかる物で、 実行中にアタッチしたプロセスにどんな変数名があるかなんて、 皆無だとおもいますが。。。?

hubllk
質問者

お礼

アドレス空間という用語があり、アドレス空間での値という意味でなら 通るかもしれませんが、用語としての認識は無いも同然でしょう。 知りたいのはアドレス空間という言葉の意味を知り、 「アドレス空間の値2000でアドレスの値が3000のiの値は7です」 というようなMessageBox()を出すのが知りたいんですよ。 技術系の人に説明すると、 下に書いた 「アドレス空間値2000で&iが3000のiの値は7です」 というのは間違っていました。iという名前がデバッガに知らされるはずがない。 だから、ANo.6に対する回答へのお礼で 「アドレス値5000のint変数の値は8です」 のように訂正しました。 デバッガを作っているなんてどうでもいいことに思えたかもしれないが、 技術系でなく頭のいい人はこの情報からさらに深い部分を読みとってくれる。 逆にこっちは、そんなメッセージボックスを出して何をしたいのかという 質問まで食らってしまった。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.11

> AもBも起動している時にこれから作るデバッガが、 デバッガの話が始めて出来ましたね。 人に話を聞くって態度じゃなくなって来たようなので私も退散します。 これでも読んで自力でがんばってください。 http://codezine.jp/a/article.aspx?aid=426

回答No.10

> AもBも起動している時にこれから作るデバッガが、 デバッガを作るという話が初めて出てきましたな。 アプリA、アプリB、これから作るデバッガはまったく別のアプリなので、互いに相手の変数にはアクセスできません。 さらに実行中の別のアプリをデバッグするなんてC/C++の範囲をはるかに超えています。 どうするつもりなんですか?

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.9

「AもBも起動している時にこれから作るデバッガが、 …としか表示しないなら区別できないでしょ。 AのiもBのiも&iは5000なんだから。」 あはは。さいですか^^ そりゃ失礼しました(笑) がんばってください。

回答No.8

アドレス空間値という用語はありません。 物理アドレス、論理アドレスという用語を使って書いてください。 物理アドレス=システム全体で通用するアドレス 論理アドレス=プロセス内でしか通用しないアドレス とでも説明したらいいでしょうか? > iの識別がしたいので iを区別・識別して何をしたいんでしょうか? アプリAからアプリBの変数に代入することはできませんよ。 通常の方法では。

hubllk
質問者

補足

下に出ているアドレス空間という初心者には分かりづらい単語を説明してほしいのです。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.7

>物理アドレスというのはここまでに出て来てているアドレス空間値ですか? アドレス空間値という用語自体はhubllkさんが作った言葉ですよね。 物理アドレス空間のアドレス値という意味ならYESです。一般用語は物理アドレスが正しい用語です。 http://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E8%A8%98%E6%86%B6 私は論理アドレスと呼びましたが、仮想アドレスという呼び方もあります。 ここで正しい用語を覚えておいてください。 >プロセスIDと&iをペアにすれば、必ずiの区別はできますか? 正解には出来ません。同時に動いている場合は区別は出来ますが、同時に動かなかった場合は、同じプロセスIDが割り当てられる可能性があります。 それは物理アドレスでも同じで、同時に動かなかった場合は同じ物理アドレスが割り当てられる可能性があります。 同時にスタートして、同時に終了するプログラムでも途中でメモリスワップが行われると物理アドレスが変化する可能性があるので、プログラムの初めから終了まで変数iが同じ物理アドレスである保障もありません。 ようするに、どうやっても同じでないことを保障することは出来ません。

関連するQ&A