アクセス違反を解決するには

解決


願:脱初心者  2006-08-04 01:24:58  No: 62654

下のコードをデバグ上で代入の行(*wire_req_out = 0;)で、アクセスエラーを起こしてしまいます。その行へマウスカーソルを持っていって値を見てみると「エラーです。式を評価できません。」となっています。
____
...
  int wire_req_in=1, wire_ack_in=2;
  int *wire_req_out, *wire_ack_out, *mc_toggle;
  int addr = 0;

  *wire_req_out = 0;
  *wire_ack_out = 0;
  *mc_toggle = 0;

         hoge_func(wire_req_in, wire_ack_in, wire_req_out, wire_ack_out, mc_toggle, addr);

----

ビルド時のメッセージ:
「warning C4700: 初期化されていないローカル変数 'wire_req_out' が使用されます」
*wire_ack_out, *mc_toggleでも同様のメッセージです。

実行時
初回メッセージ:
「Run-Time Check Failure #3 - The variable 'wire_req_out' is being used without being defined.」
初回以降のメッセージ:
「HOGE.exe の 0x0043871f でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xcccccccc に書き込み中にアクセス違反が発生しました。」

開発環境
WinXP SP2
Visual Studio 2005 (ver. 8)


Blue  2006-08-04 01:30:32  No: 62655

メモリを割り当てていない領域に値を入れようとしています。
(しかも初期化すらされていない)

ここは、C言語のポインタの基本中の基本です。

int i;
i = 10;  // OK

int* i;
*i = 10; // 実行時エラー

int n;
int* i;
i = &n;

*i = 10; // OK

int* i;
i = new int;
*i = 10; // OK


Blue  2006-08-04 01:34:27  No: 62656

もしかして、
> hoge_func
で、3〜5番目の引数が int* をほしがっているから、

> int *wire_req_out, *wire_ack_out, *mc_toggle;
にしたんでしょうか?

おそらく

int wire_req_out, wire_ack_out, mc_toggle;

wire_req_out = 0;
wire_ack_out = 0;
mc_toggle = 0;

hoge_func(wire_req_in, wire_ack_in, &wire_req_out, &wire_ack_out, &mc_toggle, addr);

でうまくいきそうですが。


三草  2006-08-04 02:05:53  No: 62657

hoge_func()内で wire_req_out に何か直接代入しようとしているのでは?

int *wire_req_out;
は、int型ポインタ の宣言で、数値を格納できるint型の宣言ではありません。
*wire_req_out = 0;
としても、メモリの0番地にint型変数があると指定しているだけなので、(実際にはないと思います)
適切な初期化をする必要があります。
たとえば、
int nMoja;
int *pMoja;
pMoja = &nMoja;
とか

hoge_func()やwire_req_out等で何をするのか分かりませんが、
上のとは別の例として、、、

int wire_req_in=1, wire_ack_in=2;
int wire_req_out, wire_ack_out, mc_toggle;
int addr = 0;
wire_req_out = wire_ack_out = mc_toggle = 0;

hoge_func(wire_req_in, wire_ack_in, &wire_req_out, &wire_ack_out, &mc_toggle, addr);


三草  2006-08-04 02:07:32  No: 62658

うわぁぁ、、、まんまBlueさんとかぶった orz


願:脱初心者  2006-08-04 02:22:12  No: 62659

Blueさん早速のレスありがとうございます。
2番目のレスで解決できました。
なるほど、
i = new int;
って言うのもあるんですね。勉強になりました。


願:脱初心者  2006-08-04 02:24:50  No: 62660

三草さんもありがとうございます。
ポインタについて間違ったことを覚えていたようです。
ご指摘ありがとうございました。


願:脱初心者  2006-08-04 02:24:54  No: 62661

三草さんもありがとうございます。
ポインタについて間違ったことを覚えていたようです。
ご指摘ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加