Подтвердить что ты не робот

0xC0000005: Место считывания нарушения доступа 0x00000000

У меня очень странная проблема с игрой космических захватчиков, над которой я работаю. В основном я получаю ошибку нарушения прав доступа:

Необработанное исключение в 0x5edad442 (msvcr100d.dll) в SpaceInvaders.exe: 0xC0000005: местоположение чтения нарушения доступа 0x00000000.

когда я включаю часть кода ниже. визуальная студия ведет меня к "strcmp.asm" при отладке. Обратите внимание, что Im не использует strcmp() в любом из моего кода. Что-то не так с кодом, или это проблема, выходящая за рамки того, что я включил? Спасибо за любую помощь

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:

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

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

Ответ 1

Эта строка выглядит подозрительно:

invaders[i] = inv;

Вы никогда не увеличиваете i, поэтому продолжаете присваивать invaders[0]. Если это всего лишь ошибка, которую вы сделали при уменьшении кода до примера, проверьте, как вы вычисляете i в реальном коде; вы можете превысить размер invaders.

Если, как указывает ваш комментарий, вы создаете 55 invaders, затем убедитесь, что invaders был правильно инициализирован для обработки этого номера.

Ответ 2

"Точка обнаружения нарушения доступа 0x00000000" означает, что вы derefrencing указатель, который не был инициализирован и, следовательно, имеет значения мусора. Эти значения для мусора могут быть любыми, но обычно это 0, и поэтому вы пытаетесь прочитать из адреса памяти 0x0, который операционная система обнаруживает и мешает вам делать.

Проверьте и убедитесь, что массив invaders[] - это то, что, по вашему мнению, должно быть.

Кроме того, вы, кажется, не обновляете i когда-либо, а это означает, что вы продолжаете размещать один и тот же объект Invader в местоположении 0 of invaders[] на каждой итерации цикла.