С ++ завершенный массив объектов с нулевым символом

Я пытаюсь создать массив объектов с нулевым символом в конце, как этот

void Game::createCreatures(int numCreatures) {
    creatures = new Creature *[numCreatures + 1];
    for (int i = 0; i <= numCreatures; i++) {
        if(i < numCreatures) {
            creatures[i] = new Runner(maze);
        } else creatures[i] = NULL;
    }
}

Тогда получи к ним доступ вот так

for (Creature *creature = creatures[0]; creature != NULL; creature++) {
    creature->travel();
}

Что именно я делаю не так? Я получаю EXC_BAD_ACCESS, когда пытаюсь "путешествовать" существо. Я знаю, что с созданием массива что-то не так, потому что, если я попытаюсь напечатать адрес всех существ, используя мой цикл доступа, он печатает навсегда. Я знаю, что с моей логикой указателя что-то не так, помогите?

декларация существ это

Creature **creatures;

2 ответа

Решение

Цикл доступа должен быть:

for (int i = 0; creatures[i] != NULL; i++) {
    Creature *creature = creatures[i];
    creature->travel();
}

Ваш цикл лечит creatures[0] как массив существ, но это всего лишь одно существо.

Если вы хотите сделать цикл с арифметикой указателя, это должно быть:

for (Creature **creature = &creatures[0]; *c != NULL; c++) {
    (*creature)->travel();
}

Ваш creature это указатель на Creature, Если вы увеличиваете этот указатель, вы будете указывать на следующий Creature за указанным в данный момент, а не за следующим указателем в вашей таблице.

Использование:

for (int i=0; creatures[i]!=nullptr; i++) {
        creatures[i]->travel();
    }
Другие вопросы по тегам