2012-05-07 43 views
12

私が取り組んでいる宇宙侵略ゲームに非常に奇妙な問題があります。基本的に私は以下のコードを含めると、アクセス違反エラー:0xC0000005:アクセス違反の読み取り場所0x00000000

Unhandled exception at 0x5edad442 (msvcr100d.dll) in SpaceInvaders.exe: 0xC0000005: Access violation reading location 0x00000000.

が表示されます。ビジュアルスタジオは、デバッグ時に私を "strcmp.asm"に連れて行きます。私のコードでは、Strcmp()を使用していないことに注意してください。コードに何か問題がありますか、これは私が含まれているものの範囲を超えた問題ですか?任意のヘルプ

const char* invarray[] = {"invader0.png", "invader1.png", "invader2.png", "invader3.png", "invader4.png"}; 
int i=0; 
//Creates 55 invaders 
for (int y=0; y<250; y+=50){ 
    for (int x=0; x<550;x+=50){ 
     Invader inv(invarray[y/50], x+50, y+550, 15, 15, 1, false, 250); 
     invaders[i] = inv; 
    } 
} 

インベーダーコンストラクタをありがとう:

Invader::Invader(const char *pic, int x, int y, int w, int h, bool dir, bool des, int point) : MovingObject(pic, x, y, w, h) , direction(dir), destroyed(des), b(0), points(point){}; 

MovingObjectコンストラクタ

MovingObject::MovingObject(const char *pic, int x, int y, int w, int h):picture(pic), positionX(x), positionY(y), width(w), height(h) {}; 
+1

インベーダーのコンストラクタ内にコードを表示します –

+1

エラーメッセージは、これがヌルポインタ逆参照であることを示していますが、コード内でどこで発生するのかわかりません。インベーダーコンストラクター以外にも、インベーダー配列がどこでどのように初期化されているかを表示してください。 Invaderのコピーコンストラクタは面白いかもしれません。 – Medo42

+0

OPをコンストラクタで更新しました。@Medo、侵略者配列は、グローバル変数として "Invader invaders [55];" – Milk

答えて

10

この行は、疑わしい:

invaders[i] = inv; 

あなたはiをインクリメントれることはありませんので、あなたはinvaders[0]に割り当てておきます。これが例にコードを縮小するときに行ったエラーの場合は、実際のコードでiの計算方法を確認してください。 invadersのサイズを超えている可能性があります。

あなたのコメントが示唆しているように、55 invadersを作成している場合は、この番号を処理するためにinvadersが正しく初期化されていることを確認してください。

+0

ありがとうございました。 – Milk

22

"アクセス違反読み取り場所0x00000000のは" あなたがされていないderefrencing a pointerだということを意味し初期化され、したがってガベージ値を持ちます。これらのゴミ値は何でもかまいませんが、通常は0であるため、オペレーティングシステムが検出して実行できないメモリアドレス0x0から読み取ろうとします。

アレイinvaders[]を確認してください。

また、あなたはiを更新していないようです - あなたはすべてのループの繰り返しでinvaders[]の場所0に同じInvaderオブジェクトを配置しておくことを意味しています。

0

他のコメントで説明したように、ここでの問題は、ポインタが適切に初期化されずに逆参照されていることです。 Linuxのようなオペレーティングシステムは、プロセスの仮想アドレス空間から最低のアドレス(例えば最初の32MB:0x00_0000 -0x200_0000)を保持します。これは、初期化されていない初期化されていないポインタの逆参照は、この場合のように一般的な間違いであるために行われます。したがって、このタイプの間違いが発生した場合、アドレス0x0にあるランダム変数を実際に読み取る代わりに(ただし、正しく初期化された場合はポインタが意図したメモリアドレスではありません)、ポインタはメモリアドレスの外側プロセスの仮想アドレス空間これによりページフォルトが発生し、セグメンテーションフォールトが発生し、プロセスにシグナルが送信されてプロセスが終了します。そのため、アクセス違反エラーが発生しています。

関連する問題