下のコードをデバグ上で代入の行(*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)
メモリを割り当てていない領域に値を入れようとしています。
(しかも初期化すらされていない)
ここは、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
もしかして、
> 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);
でうまくいきそうですが。
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);
うわぁぁ、、、まんまBlueさんとかぶった orz
Blueさん早速のレスありがとうございます。
2番目のレスで解決できました。
なるほど、
i = new int;
って言うのもあるんですね。勉強になりました。
三草さんもありがとうございます。
ポインタについて間違ったことを覚えていたようです。
ご指摘ありがとうございました。
三草さんもありがとうございます。
ポインタについて間違ったことを覚えていたようです。
ご指摘ありがとうございました。
ツイート | ![]() |