0xC0000005: emplacement de lecture de violation d'accès 0x00000000
Je vais avoir un très étrange problème avec un space invaders jeu que je suis en train de travailler sur. Fondamentalement, j'obtiens une erreur de violation d'accès:
Exception non gérée à 0x5edad442 (msvcr100d.dll)
SpaceInvaders.exe: 0xC0000005: violation d'Accès lecture de l'emplacement
0x00000000.
quand j'inclus le morceau de code ci-dessous. visual studio me prend à la "strcmp.asm" lors du débogage. Notez que je ne suis pas à l'aide de strcmp() dans mon code. Il n'y a rien de mal avec le code, ou est-ce un problème au-delà de la portée de ce que j'ai compris? Merci pour toute aide
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;
}
}
Envahisseur constructeur:
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 Constructeur
MovingObject::MovingObject(const char *pic, int x, int y, int w, int h):picture(pic), positionX(x), positionY(y), width(w), height(h) {};
source d'informationauteur Milk
Vous devez vous connecter pour publier un commentaire.
Cette ligne semble suspect:
Vous n'êtes jamais à l'incrémentation de la
i
afin de vous garder en assignant à lainvaders[0]
. Si c'est juste une erreur que vous avez commise lors de la réduction de votre code pour l'exemple, vérifiez comment vous calculeri
dans le code réel; vous pourriez être de dépasser la taille deinvaders
.Si votre commentaire l'indique, vous êtes en train de créer 55
invaders
puis vérifier que lesinvaders
a été initialisé correctement pour ce nombre."Violation d'accès lecture de l'emplacement 0x00000000" signifie que vous êtes derefrencing un pointeur qui n'a pas été initialisé et donc a des ordures valeurs. Ces ordures valeurs pourrait être n'importe quoi, mais généralement, il arrive à être
0
et si vous essayez de lire à partir de l'adresse mémoire0x0
dont le système d'exploitation détecte et vous empêche de le faire.Vérifiez et assurez-vous que le tableau
invaders[]
est ce que vous pensez qu'il devrait être.Aussi, vous ne semblez pas être mise à jour
i
jamais - ce qui vous permet de continuer à placer la mêmeInvader
objet dans l'emplacement0
deinvaders[]
à chaque itération de boucle.Le problème ici, comme précisé dans d'autres commentaires, c'est que le pointeur est en cours de déréférencer sans être correctement initialisé. Systèmes d'exploitation comme Linux maintenir les plus bas d'adresses (par exemple, la première 32MO: 0x00_0000 -0x200_0000) de l'espace d'adressage virtuel d'un processus. C'est à cause de déférence à zéro non-initialisé pointeurs est une erreur commune, comme dans ce cas. Ainsi, lorsque ce type d'erreur se produit, au lieu de la lecture d'une variable aléatoire qui se trouve être à l'adresse 0x0 (mais pas le souvenir de l'adresse de pointeur serait prévu pour s'initialiser correctement), le pointeur serait la lecture à partir d'une adresse de mémoire à l'extérieur de l'espace d'adressage virtuel. Cela provoque un défaut de page, ce qui entraîne une erreur de segmentation, et un signal est envoyé au processus de la tuer. C'est pourquoi vous obtenez l'erreur de violation d'accès.