Проблема с компиляцией 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 шт):
У вас проблема вот в этих строках
int n;
int array[n];
Причем это не синтаксическая ошибка, а логическая. Если попростому - то при объявлении переменной n в ней может оказаться любое значение. Абсолютно любое. Поэтому следующей строкой вы инициализируете массив на случайное число элементов.
И если потом пользователь вводит число элементов меньше чем у вас было в n - то в общем-том ничего страшного - идет работа с массивом. А если получается так что в n оказалось число меньше, чем потом введёт пользователь, то возникают проблемы. Так как ваша программа выходит за пределы памяти, выделенной для массива и начинает писать туда куда писать нельзя. Как результат "крах" приложения.
Чтобы этого избежать у вас есть два варианта:
- Для начинающих. Проинициализировать массив на некое постоянное число элементов. Например, на 100. А ввод пользователя ограничить - т.е. проверять, чтобы n было меньше 100.
- Для продвинутых и более правильный. Выделять память под массив динамически. Т.е. после ввода значения n пользователем выделять память на n элементов.