アクセス違反が発生する問題の回避方法とは?

このQ&Aのポイント
  • アクセス違反が発生する問題について、回避方法を知りたい。
  • C++でポインタを利用したプログラムを実行しているが、アクセス違反が発生して停止してしまう。
  • ポインタに代入したアドレスを表示するために、アクセス違反を回避する方法を教えてほしい。
回答を見る
  • ベストアンサー

読み込み中にアクセス違反が発生しました、と出ます。これを回避することは

読み込み中にアクセス違反が発生しました、と出ます。これを回避することはできますか? C++でプログラミングをしています。 現在、ポインタ(p)に入れたアドレスをずらしていって、メモリの任意の位置の値を表示する、というプログラムを制作しています。 具体的に言うと、上記のプログラムではない別のプログラムを実行し、そのプログラムで宣言した変数のアドレスを表示させます。そしてそのプログラムが動いている最中に、上記のプログラムを起動させ、ポインタpにその変数のアドレスを代入して、表示させようとしました。 しかし、止まってしまいます。デバッグしてみると、「test.exe の 0x00024ad5 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x0014fde8 を読み込み中にアクセス違反が発生しました」と出ます。 なんとかこれを回避して、ポインタに代入したアドレスを表示さすことはできませんか? 宜しくお願いします。 ちなみに、自分がかなり妙なことをしているのは自覚しているつもりです。

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

#2です。 もう少し突っ込んで話をすると、今のOSはたいてい仮想アドレス方式で各プロセスのアドレス空間はそのプロセス内でのみ有効なものです。 つまり、プロセスAの0番地とプロセスBの0番地は値は同じでも全く別の箇所を指しているということです。 ですが、プログラムの中には複数プロセスで協調動作させる等の理由により質問のような他プロセスが扱うメモリの中身を参照・変更したい場合があります。 それを実現するのが共有メモリ等の機構である訳です。

sakura_9988
質問者

お礼

成程、そういうことですか。 わざわざありがとうございました。

その他の回答 (2)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

別のプログラムのアドレス空間にはアクセスできません。 そういうことをやるには共有メモリを使ってください。

回答No.1

> 具体的に言うと、上記のプログラムではない別のプログラムを実行し、そのプログラムで宣言した変数のアドレスを表示させます。そしてそのプログラムが動いている最中に、上記のプログラムを起動させ、ポインタpにその変数のアドレスを代入して、表示させようとしました。  一般的にそういうアクセスはOSが禁じているので出来ません。OSがエラーを出しているのでC/C++のプログラミングの問題ではありません。  自作OSとかでそういう保護機能がない場合は可能でしょうけど。欲しければ自分で作ってください。  共有メモリ等の機能を使えば、その範囲でなら可能となりますが、OSの記載が無いのでそれ以上はなんとも言えません。

sakura_9988
質問者

お礼

ありがとうございました。参考にします。

関連するQ&A

  • VC++のエラー(初回の例外)の原因と回避策

    VC++のプログラムを作っていて、たまに実行中に異常終了してしまうことがあります。 「****初回の例外が発生しました: 0xC0000005: 場所 ******* を書き込み中にアクセス違反が発生しました。 」 プログラム的にはメモリファイルマッピングして、そのデータをmemcpyでコピろうとする時にこの関数で上記エラーがでます。 毎回出るわけではなく、何度も実行される(ループなどで)とたまにおきているみたいです。 具体的にはどのような場合にこのようなエラーが生じるのでしょうか? また回避策はありますでしょうか?

  • C++でのアクセス違反

    WindowsXP、VisualC++6.0でのプログラムです。 C側からロードするDLL(自分で作成)のあるaddress(いつも同じ)で たまに、アクセス違反となりMicrosoft送信メッセージが出てプログラムが閉じます。 頻度は、1ヶ月に1回程度です。 よく起こる号機とそうでない号機が存在します。 あるアドレスのエラー個所は、「変数=x;」 という文です。 エラーが起こった場合は、変数の配列の添え字が配列の次元を越える数値は 入らないようにしているのに、想定外の値となっているようです。 このような経験があった方は、どういうふうに解決されているのか教えてください。

  • ポインタ変数を変数に渡す方法

    (int * 型)ポインタ変数に代入されたアドレスを、(普通の)int 型変数に代入したいのですが、どのようにするのが正しいのでしょうか。 想定しているケースは、与えられたメモリ番地に対して、アドレスオフセットを加えるなどの操作を施して「補正アドレス」を生成し、メモリアクセスを行う、というような特殊な操作を実現するような場合です。 ※ メモリ番地がポインタ宣言で与えられる、という制約があります。 以下サンプルプログラムを書きました。組み込み系のプログラムを記述していますが、これで正しいでしょうか。 unsigned int *p, *p1; // ポインタ変数宣言 unsigned int value; p= (unsigned int *)0x00001F00; // メモリの0x1F00番地 value = p; // <-- ここが心配 value |= 0xCC << 16; // 与えられたアドレスから value &= 0x4 << 12; // 「補正アドレス」生成 p1 = (unsigned int *)value; *p1 = 0xA5A5_A5A5; // 「補正アドレス」にA5A5... をライト C言語初心者で、いろいろなサイトを見てみたのですが、説明されているページが見つからず質問させていただきました。どうぞよろしくお願いします。

  • Visual C++2008でおきたエラーについて

    現在VisualC++2008でゲームを作っているのですが、 BGMをつけようと思いプログラムを少し追加したのですが test.exe の 0x005653b1 で初回の例外が発生しました: 0xC0000005: 場所 0x00000060 を読み込み中にアクセス違反が発生しました。 test.exe の 0x005653b1 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000060 を読み込み中にアクセス違反が発生しました。 プログラム '[2956] test.exe: ネイティブ' はコード 0 (0x0) で終了しました。 と言ったエラーが出てきてしまい止まってしまいます、とりあえずCtrl+Zで最初の状態にもどしたにもかかわらず実行しようとすると上と同じエラーが出てきてしまい起動できなくなってしまいました、上のエラーはどのようなときに起こるのでしょうか?それとどうすれば回避できるか教えてくださいm(_ _;m) ソースファイルを張りたいのですが2000文字超えているのでむりでした・・・。

  • 例外発生(アクセス違反)

    こんにちは。 VB6で開発した自作アプリを実行すると アプリケーション例外が発生します。 ワトソンログを見ますとc0000005(アクセス違反)となっています。 ただ、コンパイルしなおしたEXEで実行すると問題なくできます。 (プログラム等は一切変更しておりません。) 例外に関しましても発生する場合と、しない場合があり、 頻度も3割くらいです。。。 確証はないのですが、別のパソコン(OS)でコンパイルしたEXE を実行すると必ず例外発生しているような。。。 (複数機能があるのですが、特定のもののみ例外発生します) こういう場合、プログラムに問題ありと考えるべきでしょうか???

  • ハンドルされていない例外とアクセス違反

    ハンドルされていない例外とアクセス違反 .NET2003のMFCでプログラムをしたところ上記のエラーが発生しました。 ビルドが通ったのでデバッグしたところ、"(mfc71d.dll) でハンドルされていない例外が発生しました""書き込み中にアクセス違反が発生しました"となりました。 また、自分ではプログラムしていないcppファイル中、以下の"{"の所でデバッグが止まってしまいました。 CSyncObject::CSyncObject(LPCTSTR pstrName) { UNUSED(pstrName); // unused in release builds プログラム初心者のためどこが悪いのかわからず困っています。 原因となるようなミスを教えてください。 よろしくお願いします。

  • VBのEXEのアクセス違反について

    VB6.0にてソフトウェアを作成し、exe形式に保存しました。 それをVBがインストールされていないPCから起動したときに NTワトソン博士から下記メッセージが出ました 「アクセス違反 0xc0000005 アドレス0x6003cd9e」 ソフトウェアの開発環境は Win2000 Servicepack3 VB6.0 アクセス違反が起こったPCの環境は WinNT4.0 ServicePack6A 常駐ソフトウェアはありません。 他のNTユーザーの方でVBインストール無しの 所にも入れたのですが問題なく動きました。 今回アクセス違反が起こったものは 新しくNTをインストールしたものです。 アクセス違反をなくし、Exeを動かす方法はありますか?

  • 自作アプリでアクセス違反が発生して困っています

    プログラムをDelphiで作成しているのですが、実行中に「致命的なエラー」で終了することが多くなりました。 そこで、エラーログを開いてみると、 アプリケーション例外が発生しました: 例外番号: c0000005 (アクセス違反) と言われています。思い当たる節は、単に存在しないアドレスにアクセスをしたとかそういうレベルだとは思うのですが、どうしても場所が特定できません。 (デバッガを積んでいない他人の環境でだけ発生するのです) スタックバックトレースを参照すると、以下のようなものがありました。 ntdll!ZwYieldExecution kernel32!ProcessIdToSessionId ntdll!NtWaitForMultipleObjects kernel32!WaitForMultipleObjects kernel32!lstrcmpiW ntdll!NtReplyWaitReceivePortEx rpcrt4!NdrConformantArrayMemorySize winmm!DriverCallback winmm!waveOutSetVolume ちなみに、MMTimerを使い数値を演算して、ApplicationIdleを見つけて描画を行っている普通の(?)シミュレーションプログラムです。(サウンドとシリアルからの入力も使っています) 詳しくはないのですが、この近辺でコケているということなのでしょうか・・・。

  • 変数

    ポインタ変数なんですが、 int *p;と宣言した時 自分自身のアドレスを持ってますか?(プログラムが終わるまで?) ポインタ変数は、他の変数アドレスを格納しますよね。 また数値の値も格納しますよね。 これは、ポインタ変数宣言 時の自分のアドレスに、 他の変数のアドレス、数値の値、 と二つを格納しているのですか? ポインタ自身のアドレス出力は(int *pの時) printf("%p",&p); 他の変数のアドレス出力は(p=&の時) printf("%p",p); であってますか? 普通の変数は、自身のアドレス、数値の値、だけ、 ポインタ変数はさらに、他の変数の値を格納していますか? 教えてください。

  • 保護違反・・・・・・・

    昨日、新型ウィルスMSブラストに対抗するプログラムをマイクロソフト社のHPよりダウンロードさせたところ、今度はプリンターが作動しなくなり、全然認識し無くなりました。 そしてダウンロードした、いくつかのプログラムを削除したところ(まったくの適当です)半分認識したのですがプリンターウィザードの最後で 「C:¥WINDOWS¥explrer.exe   関数アドレス0x500026e5保護違反が発生しました(例外0xc0000005)プロパティページの数ページまたはすべてのページが表示されない可能性があります。」と出てしまいプリンターがまったく作動しません。 こんなことならダウンロードするのでは無かったと悔やんでいます。 この意味が全然判りません、どなたか詳しい方教えてください。 使用OSはWINXPです。

専門家に質問してみよう