• 締切済み

C++でのアクセス違反

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

みんなの回答

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

そういうのはだいたい他の部分での配列範囲外アクセスやポインタの操作ミスです。つまり、その変数を操作していない処で書き換えていることになります。 VC++のデータブレークポイントを使えばキャッチ可能です。まぁ、再現性を高めないとデバッグ起動で気長に待つことになりますけどね。 「ブレークポイント詳細 [VC++の使い方]」 http://www.nitoyon.com/vc/tutorial/debug/breakpoint.htm

aki2004-09-08
質問者

お礼

回答ありがとうございました。

関連するQ&A

  • DLLへのアクセス

    同じDLLに対して、VBとVCでアクセスしている場合に 想定外のエラーが出たことはありますか? 2個のプログラムから同じDLLにアクセスする場合は、DLL名を別名にした方がいいのでしょうか?

  • visual C++2008 Express 変数宣言等について

    sea_clear_skyです。 質問させて頂きます。 <環境> WindowsXP SP3 VisualC++ 2008 Express 現在、VisualC++ 2008 Expressでプログラムの勉強をしています。 VisualC++ Expressでコンソールアプリケーションじゃなく、 Windowsフォームアプリケーションで、変数の宣言(配列)の仕方と message::showで、変数の値を表示させる方法がわかりません。 C/C++などの、コンソールアプリケーションの方法では エラーがでて、実行できなかったので、 Windowsフォームアプリケーション用の記入の仕方があるのでは ないかと思っています。 初心者なので、わからない状態です。 VC++ 2008 EXPRESS 変数宣言 VC++ 2008 EXPRESS 変数 VC++ 2008 EXPRESS データ型 message;;show vc++ VC++ 2008 リファレンス VC++ 2008 入門 等など、たくさんのキーワードでホームページを 検索しましたが、知りたいことが載っている ホームページを見つけることができませんでした。 参考HPや解決方法について、ご教授お願いします。 すいませんが、よろしくお願いします。

  • error C2105 CとC++の違い関して

    C++で動いていたプログラムをCに移行したらerror C2105が出力されました。プログラムは以下の通りです。   :  int *p;  int i;   : i = *(++p)++; //pを1つ進めて、内容を取り出し、さらにpを進めたい   :  C++では++Pの評価結果がポインタ変数となり、Cでは単なるアドレスになってしまっているようですが、  これは言語仕様の違いですか?  それとも、私のC++ではたまたま動いただけで、本来このような使用方法はしてはいけないのでしょうか?  私はVisualC++6.0を使用しています。また、上記でC++とCといっているのは、ファイルの拡張子をcppをcにしただけのことを言っています。どなたかご教授お願いします。

  • 2次元配列でエラーがでます。

    VC++を使ってプログラムを書いています。2次元配列で配列を大きくするとエラーが出てしまいます。1次元配列の場合は今のところ特にエラーは出ない感じです。プログラムにもよりますが、小さい配列でa[300][300]くらいでエラーが出てしまいます。だいたい配列をa[10000][10000]くらい取りたいのですが。このエラーを解消する方法はないでしょう?

  • クラス内で二次元配列は無理なのでしょうか?

    VisualC++ 2005を使っています。 class test{ int ary[10][2]; }; とすると、混合型はサポートされていません。 とエラーになります。 クラス内で二次元配列は無理なのでしょうか?

  • verilogで配列の任意の8bitを取り出す方法

    配列の中の任意の8bitを取り出すのに、  hoge[fuga:fuga + 8] と書きましたが、エラーになってしまいました。 配列の添え字には、変数は記述できないのでしょうか? とすると、他にどの様な書き方があるのでしょうか? 教えてください。よろしくお願いします。 (verilog初心者です)

  • C言語プログラム

    こんな課題が出たのですが、さっぱりわかりません。 誰か解る人がいたら教えてほしいです。 1 3+5+7+…+nと奇数の和を求め、和が100を越えたときのnの値を求めて表示するプログラムをdo~whileを使って作成しなさい。 2  キーボードから3つの数を読み込み、最大値を求める処理を繰り返し行うプログラムを、do~whileを使って作成しなさい。繰り返しの終了は、計算のあとで、'S'(1文字)が入力されるまでとし、それ以外の文字では、処理を続行すること。 3  整数型1次元配列kに整数123,456,789をそれぞれ代入し、その内容を表示するプログラムを作成しなさい。 4  文字型1次元配列strに'u'を、'n'、'i'、'x'それぞれ代入し、その内容を文字列として出力するプログラムを作成しなさい。 5  要素数50の整数型1次元配列mの要素すべてに、その添字に対応した0~49の数値を代入し、その内容を表示するプログラムを作成しなさい。 3は #include <stdio.h> main() { int k[3]; k[0] = 123; k[1] = 456; k[2] = 789; printf("%d\n%d\n%d", k[0], k[1], k[2]); return 0; } と解いてみたんですが、やっぱ間違えてますよね?

  • c++ セグメントエラー

    あるプログラムをつくっていて、コンパイルはできたのですが、セグメントエラーというランタイムエラーが取り除けません。 エラーの発生している行は特定できました。 その行は、以下のようなものです。 AAA aaa[4][64][4]; AAAは型名、aaaは配列名です。3次元配列の宣言でエラーが発生していました。 エラーの発生している行はこの行で、代入などを行っている部分ではありません。配列の大きさを考えてみても、メモリが足りなくなっているとは考えづらいのですが、他になにか原因はあるのでしょうか? 考えられる原因を教えてください。

  • 2次元配列について、教えてください。

    基本的なことなのでしょうがまだよくわかっていません。 ワークシートにたとえると、1次元は縦方向(行番号方向)、二次元は横方向(列番号方向)ですよね? 列数、行数にあたるのが1次元、二次元それぞれの添字ですよね? そしてセルに当たるのが「要素」ですよね? 以上の解釈があっていたら、 1.A列やB列にあたるものはなんと呼ぶのでしょうか? 2.1行目や2行目にあたるのはなんと呼びますか? 3.ワークシートで行や列を削除するような感じで2次元配列の行や列にあたるものを削除することはできますか? 4.UBound関数は、配列の大きさを調べられますが、この大きさは添字です。ワークシートのCells(65536,1).End(xlUp)Rowのように実際にデータがどこまで入っているか調べられますか? 教えてください。 前提とした解釈自体が違っていたらそれもご指摘ください。

  • PL/SQLでの配列についてetc

    PL/SQLについて、何点か質問があります。 どれかひとつでも構わないので、皆さんのお知恵をお貸しください。 (1)ある配列変数に格納されている要素を全てDBMS_OUTPUT.PUT_LINE();で表示することってできますか? (PHPのecho var_dump();のような感じで) (2)ある配列変数に使用されている添え字(もしくは添え字の数)を取得することってできますか? (3)ORA-01403エラーはカーソルのデータが存在しない場合に、発生するケースはありますか? よろしくおねがいします。

専門家に質問してみよう