Проблема с компиляцией C++

Столкнулся с плавающей проблемой не запуска программы C++

Компиляция проходит успешно, exe программа создается без проблем, но ее запуск представляется невозможным. Ошибка происходит из-за инициализации закомментированной переменной.

    #include <stdio.h>

    int main(int argc, char const *argv[])
{
    
    int n;
    int array[n];
    //int average = 0; 

    printf("Введите количество элементов массива\n");
    scanf("%d", &n);

    for (int i = 0; i < n; i++)
    {
        printf("array[%i] = ", i);
        scanf("%d", &array[i]);
    }

    int sum = 0;
    for (int i = 0; i < n; i++)
    {
        sum += array[i];
    }

    printf("%i\n", sum);

    return 0;
}

Предположил, что переменная, пытается прописать себя в уже занятую ячейку ROM, потому что иногда программа все же запускается сразу после перезагрузки Windows, а после открытия дополнительных программ кроме VS Code запуска не происходит.

Посмотрел в gcc compiler explorer как выглядит код компиляции, и создание переменных в assembler выглядит однородно (одинаково), из чего можно судить, что это не проблема компиляции кода.

Также проверил exe программу на разных системах и машинах, и везде ошибка одна и та же. Версия моего компилятора 9.2.0, друг попробовал скомпилировать код программы и в 10.2.0, и в 13.2.0 версии, но ничего не изменилось.


Ответы (1 шт):

Автор решения: newman

У вас проблема вот в этих строках

int n;
int array[n];

Причем это не синтаксическая ошибка, а логическая. Если попростому - то при объявлении переменной n в ней может оказаться любое значение. Абсолютно любое. Поэтому следующей строкой вы инициализируете массив на случайное число элементов.

И если потом пользователь вводит число элементов меньше чем у вас было в n - то в общем-том ничего страшного - идет работа с массивом. А если получается так что в n оказалось число меньше, чем потом введёт пользователь, то возникают проблемы. Так как ваша программа выходит за пределы памяти, выделенной для массива и начинает писать туда куда писать нельзя. Как результат "крах" приложения.

Чтобы этого избежать у вас есть два варианта:

  1. Для начинающих. Проинициализировать массив на некое постоянное число элементов. Например, на 100. А ввод пользователя ограничить - т.е. проверять, чтобы n было меньше 100.
  2. Для продвинутых и более правильный. Выделять память под массив динамически. Т.е. после ввода значения n пользователем выделять память на n элементов.
→ Ссылка