Ошибка исключения по адресу 0x0000000000000000

Рейтинг: 0Ответов: 1Опубликовано: 10.04.2023

Я запускаю нужные функции с помощью массива указателей по вводу с клавиатуры, появляется ошибка:

Вызвано исключение по адресу 0x0000000000000000 в BookListing6.exe: 0xC0000005: нарушение прав доступа при исполнении по адресу 0x0000000000000000 в строке

std::cout << std::endl << (i + 2) << " iteration" << std::endl ;

void Listing6_1(void);

void (*functptr[30])() = { Listing6_1 };

int main() {
    int FunctNum;
    int i;
    for (i = 0; i < 100; i++) {
        std::cout << '\n' << i + 1 << " iteration\n";
        std::cout << "Programs avaible to run: ";
        for (int j = 0; j < 30; ++j) {
            if (*functptr[j] != nullptr) {
                std::cout << j + 1 << ", ";
            }
        }
        std::cout << "\nEnter the num (int) of program to start or enter # to stop program:___\b\b\b";
        char temp;
        std::cin >> temp;
        if (temp == '#') {
            break;
        }
        FunctNum = temp;
        std::cout << '\n';
        (*functptr[FunctNum - 1])();
        std::cout << std::endl << (i + 2) << " iteration" << std::endl ; //ошибка появляется тут
    }
    return 0;
}

Ответы

▲ 0Принят

Код

char temp;
std::cin >> temp;
if (temp == '#') {
    break;
}
FunctNum = temp;

плох в том, что допускает ввод единственного символа, так что у вас могут быть потом проблемы с его расширением, например, или с защитой от неверного ввода. Если оставить все это в стороне, то в любом случае последнюю строку надо переписать как

FunctNum = temp - '0';

чтобы правильно преобразовать символ в числовое значение.