2012-05-07 11 views
12

Mam bardzo dziwny problem z grą Space Invaders, nad którą pracuję. Zasadniczo pojawia się błąd naruszenia zasad dostępu:0xC0000005: Lokalizacja odczytu naruszenia dostępu 0x00000000

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

, gdy dołączę poniższy fragment kodu. visual studio przenosi mnie do "strcmp.asm" podczas debugowania. Zauważ, że nie używam strcmp() w żadnym z moich kodów. Czy coś jest nie tak z kodem, czy jest to problem wykraczający poza zakres tego, co zawarłem? Dzięki za wszelką pomoc

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

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

Pokaż kod wewnątrz konstruktora Invadera –

+1

Komunikat o błędzie sugeruje, że jest to dereferencja wskaźnika pustego, ale nie widzę, gdzie to by się stało w kodzie. Oprócz konstruktora Invader, pokaż nam, gdzie/jak inicjowana jest również tablica invaders. Konstruktor kopiowania Invadera również może być interesujący, jeśli taki posiada. – Medo42

+0

Właśnie zaktualizowałem OP z [email protected], tablica invader została właśnie zainicjowana jako zmienna globalna: "Invader invaders [55];" – Milk

Odpowiedz

10

Linia ta wygląda podejrzanie:

invaders[i] = inv; 

Nigdy nie jesteś wzrastających i, więc ciągle przypisując invaders[0]. Jeśli jest to po prostu błąd wprowadzony podczas zmniejszania kodu do przykładu, sprawdź, jak obliczyć i w prawdziwym kodzie; możesz przekroczyć rozmiar invaders.

Jeśli Twój komentarz sugeruje, że tworzysz 55 invaders, to sprawdź, czy invaders został poprawnie zainicjowany, aby obsłużyć ten numer.

+0

wielkie dzięki, to było to: s – Milk

22

"Dostęp Naruszenie czytania lokalizacji 0x00000000" oznacza, że ​​jesteś derefrencing a pointer która nie była zainicjalizowany i dlatego ma wartości śmieci. Te wartości śmieci mogą być dowolne, ale zazwyczaj jest to 0 i dlatego próbujesz odczytać z adresu pamięci 0x0, który system operacyjny wykrywa i uniemożliwia ci wykonanie.

Sprawdź i upewnij się, że tablica invaders[] jest tym, co Twoim zdaniem powinno być.

Ponadto, nie wydaje się być aktualizacją i kiedykolwiek - co oznacza, że ​​wciąż ten sam Invader umieszczenie obiektu w miejscu 0 z invaders[] w każdej iteracji pętli.

0

Problem tutaj, jak wyjaśniono w innych komentarzach, polega na tym, że wskaźnik jest dereferencyjny bez odpowiedniego zainicjowania. Systemy operacyjne, takie jak Linux, utrzymują najniższe adresy (np. Pierwsze 32 MB: 0x00_0000 -0x200_0000) poza wirtualną przestrzenią adresową procesu. Dzieje się tak, ponieważ odwołanie do zerowania nie zainicjowanych wskaźników jest częstym błędem, jak w tym przypadku. Tak więc, gdy występuje ten typ błędu, zamiast faktycznie odczytać zmienną losową, która ma miejsce pod adresem 0x0 (ale nie adres pamięci, do której będzie przeznaczony wskaźnik, jeśli zostanie poprawnie zainicjalizowany), wskaźnik będzie czytał z adresu pamięci spoza wirtualna przestrzeń adresowa procesu. Powoduje to błąd strony, który powoduje błąd segmentacji i sygnał jest wysyłany do procesu, aby go zabić. Właśnie dlatego otrzymujesz błąd naruszenia dostępu.

Powiązane problemy