2012-05-07 31 views
12

Sto avendo un problema molto strano con un gioco di invasori dello spazio su cui sto lavorando. Fondamentalmente ottengo un errore di violazione di accesso:0xC0000005: Posizione di lettura di violazione di accesso 0x00000000

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

quando includo il codice di seguito. Visual Studio mi porta a "strcmp.asm" durante il debug. Nota che Im non sta usando strcmp() in nessuno dei miei codici. C'è qualcosa di sbagliato nel codice, o si tratta di un problema che va oltre lo scopo di ciò che ho incluso? Grazie per qualsiasi aiuto

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 costruttore:

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 Constructor

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

Mostra codice all'interno del costruttore di Invader –

+1

Il messaggio di errore suggerisce che si tratta di un dereferenziamento del puntatore nullo, ma non riesco a vedere dove ciò potrebbe accadere nel codice. A parte il costruttore di Invader, per favore mostraci dove/come viene inizializzato anche l'array di invaders. Anche il costruttore di copie di Invader potrebbe essere interessante, se ne ha uno. – Medo42

+0

Ho appena aggiornato l'OP con i [email protected], l'array di invader è stato appena inizializzato come variabile globale: "Invader invasori [55];" – Milk

risposta

10

Questa linea sembra sospetto:

invaders[i] = inv; 

Non si è mai incrementando i, in modo da mantenere l'assegnazione a invaders[0]. Se questo è solo un errore che hai commesso quando riduci il codice nell'esempio, verifica come calcoli i nel codice reale; potresti superare le dimensioni di invaders.

Se come suggerisce il tuo commento, stai creando 55 invaders, quindi verifica che invaders sia stato inizializzato correttamente per gestire questo numero.

+0

grazie mille, era così: s – Milk

22

"Violazione di accesso posizione 0x00000000 lettura" significa che sei derefrencing a pointer che non è stato inizializzato e quindi ha valori garbage. Quei valori spazzatura potrebbero essere qualsiasi cosa, ma di solito capita di essere 0 e quindi si tenta di leggere dall'indirizzo di memoria 0x0, che il sistema operativo rileva e impedisce di fare.

Verificare e assicurarsi che l'array invaders[] sia ciò che si ritiene dovrebbe essere.

Inoltre, non sembrano essere l'aggiornamento i mai - il che significa che si continua a porre la stessa Invader oggetto in posizione 0 di invaders[] ad ogni iterazione del ciclo.

0

Il problema qui, come spiegato in altri commenti, è che il puntatore si sta denigrando senza essere inizializzato correttamente. I sistemi operativi come Linux mantengono gli indirizzi più bassi (ad esempio i primi 32 MB: 0x00_0000 -0x200_0000) dallo spazio di indirizzi virtuali di un processo. Ciò avviene perché il dereferenziamento di puntatori non inizializzati azzerati è un errore comune, come in questo caso. Quindi, quando accade questo tipo di errore, invece di leggere effettivamente una variabile casuale che si trova all'indirizzo 0x0 (ma non l'indirizzo di memoria a cui sarebbe destinato il puntatore se inizializzato correttamente), il puntatore verrebbe letto da un indirizzo di memoria esterno a lo spazio degli indirizzi virtuali del processo. Ciò provoca un errore di pagina, che provoca un errore di segmentazione e un segnale viene inviato al processo per eliminarlo. Ecco perché stai ricevendo l'errore di violazione di accesso.

Problemi correlati