2012-05-07 41 views
12

Tengo un problema muy extraño con un juego de invasores del espacio en el que estoy trabajando. Básicamente recibo un error de violación de acceso:0xC0000005: Acceso a la ubicación de lectura de la infracción 0x00000000

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

cuando incluyo el fragmento de código siguiente. Visual Studio me lleva a "strcmp.asm" cuando se depura. Tenga en cuenta que no estoy usando strcmp() en ninguno de mis códigos. ¿Hay algún problema con el código o es un problema que está más allá del alcance de lo que he incluido? Gracias por cualquier ayuda

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

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

Mostrar código dentro del constructor de Invader –

+1

El mensaje de error sugiere que esta es una referencia de puntero nulo, pero no puedo ver dónde ocurriría esto en el código. Además del constructor de Invader, muéstranos dónde/cómo se inicializa la matriz de invasores. El constructor de copia de Invader también podría ser interesante, si tiene uno. – Medo42

+0

Acabo de actualizar OP con [email protected], la matriz invasora acaba de inicializarse como variable global: "Invasores invasores [55];" – Milk

Respuesta

10

Esta línea parece sospechoso:

invaders[i] = inv; 

Nunca está incrementando i, por lo que mantener la asignación a invaders[0]. Si esto es solo un error que cometió al reducir su código al ejemplo, verifique cómo calcula i en el código real; podría exceder el tamaño de invaders.

Si, como sugiere su comentario, está creando 55 invaders, luego verifique que invaders se haya inicializado correctamente para manejar este número.

+0

muchas gracias, eso fue todo: s – Milk

22

"Acceso violación ubicación 0x00000000 lectura" significa que estás derefrencing a pointer que no ha sido inicializado y, por lo tanto, tiene valores de basura. Esos valores basura pueden ser cualquier cosa, pero generalmente es 0 y por lo tanto, intenta leer desde la dirección de memoria 0x0, que el sistema operativo detecta y le impide hacerlo.

Compruebe y asegúrese de que la matriz invaders[] es lo que cree que debería ser.

Además, no parece ser la actualización de i siempre - lo que significa que usted guarda la colocación de la misma Invader objeto en lugar de 0invaders[] en cada iteración del bucle.

0

El problema aquí, como se explica en otros comentarios, es que el puntero está siendo desreferencia sin haberse inicializado correctamente. Los sistemas operativos como Linux mantienen las direcciones más bajas (por ejemplo, los primeros 32MB: 0x00_0000 -0x200_0000) fuera del espacio de direcciones virtuales de un proceso. Esto se hace porque eliminar referencias a punteros no inicializados es un error común, como en este caso. Entonces, cuando ocurre este tipo de error, en lugar de leer realmente una variable aleatoria que se encuentra en la dirección 0x0 (pero no la dirección de memoria a la que se destinaría el puntero si se inicializa correctamente), el puntero estaría leyendo desde una dirección de memoria fuera de el espacio de direcciones virtuales del proceso. Esto causa un error de página, que produce un error de segmentación, y se envía una señal al proceso para matarlo. Es por eso que está obteniendo el error de violación de acceso.

Cuestiones relacionadas