web-dev-qa-db-fra.com

0xC0000005: emplacement de lecture de violation d'accès 0x00000000

J'ai un problème très étrange avec un jeu d'envahisseurs spatiaux sur lequel je travaille. En gros, j'obtiens une erreur de violation d'accès:

Exception non gérée à 0x5edad442 (msvcr100d.dll) dans SpaceInvaders.exe: 0xC0000005: emplacement de lecture de violation d'accès 0x00000000.

lorsque j'inclus le morceau de code ci-dessous. visual studio m'amène à "strcmp.asm" lors du débogage. Notez que je n'utilise strcmp () dans aucun de mes codes. Y a-t-il un problème avec le code ou s'agit-il d'un problème qui dépasse la portée de ce que j'ai inclus? 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;
    }
}

Constructeur envahisseur:

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){};

Constructeur MovingObject

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

Cette ligne semble suspecte:

invaders[i] = inv;

Vous n'incrémentez jamais i, vous continuez donc d'assigner à invaders[0]. S'il s'agit simplement d'une erreur que vous avez commise en réduisant votre code à l'exemple, vérifiez comment vous calculez i dans le code réel; vous pourriez dépasser la taille de invaders.

Si, comme le suggère votre commentaire, vous créez 55 invaders, vérifiez que invaders a été correctement initialisé pour gérer ce nombre.

10
Fraser

" Emplacement de lecture de la violation d'accès 0x00000000 " signifie que vous êtes déréfrencer un pointeur qui n'a pas été initialisé et qui a donc des ordures valeurs. Ces valeurs inutiles peuvent être n'importe quoi, mais il se trouve généralement qu'il s'agit de 0 et vous essayez donc de lire à partir de l'adresse mémoire 0x0, ce que le système d'exploitation détecte et vous empêche de faire.

Vérifiez et assurez-vous que le tableau invaders[] est ce que vous pensez que cela devrait être.

De plus, vous ne semblez pas mettre à jour i jamais - ce qui signifie que vous continuez de placer le même Invader objet dans l'emplacement 0 de invaders[] à chaque itération de boucle.

27
Tneuktippa

Le problème ici, comme expliqué dans d'autres commentaires, est que le pointeur est déréférencé sans être correctement initialisé. Les systèmes d'exploitation comme Linux gardent les adresses les plus basses (par exemple, les premiers 32 Mo: 0x00_0000 -0x200_0000) hors de l'espace d'adressage virtuel d'un processus. Cela est dû au fait que le déréférencement de pointeurs non initialisés mis à zéro est une erreur courante, comme dans ce cas. Ainsi, lorsque ce type d'erreur se produit, au lieu de lire réellement une variable aléatoire qui se trouve à l'adresse 0x0 (mais pas l'adresse mémoire à laquelle le pointeur serait destiné s'il était correctement initialisé), le pointeur lirait à partir d'une adresse mémoire à l'extérieur de l'espace d'adressage virtuel du processus. Cela provoque une erreur de page, qui se traduit par une erreur de segmentation, et un signal est envoyé au processus pour le tuer. C'est pourquoi vous obtenez l'erreur de violation d'accès.

5
Jay Medina