@LebedevImagine

Почему нельзя создать массив произвольной длины в С++?

Как новичок, столкнулся с проблемой, что если на момент компиляции кода размер массива не известен, то конструкция в виде

int n;
cin >> n;
int arr[n];


просто не сработает. Но мне очень бы хотелось, чтобы размер массива задавал конечный пользователь, не используя при этом библиотеку классов STL или реализацию через указатели. Я знаю, что для этого следовало бы использовать динамический массив или список. Но меня интересует вопрос: чем обусловлено такое ограничение? Почему компилятор не дает создать такую конструкцию?
  • Вопрос задан
  • 568 просмотров
Решения вопроса 1
RabraBabr
@RabraBabr
Если коротко исторически так сложилось.

В который раз встречаю человека который упорно не желает пользоваться STL. При том это какое то иррациональное нежелание.

А теперь длинно.

Хочешь плохому научу?
Выделяй память malloc'ом, а когда надо изменить размер "массива", пользуйся realloc'ом. Можешь так же как в встроенном массиве пользоваться [] для обращения к элементам массива.

Дальше напиши какую нибудь серьезную программу тыщ хотя бы на 20 строк. И в один прекрасный день узнай, что она крашится в самом неожиданном месте, хотя раньше все работало. Далее две бессонных недели, с красными глазами проведи с отладчиком в поисках неуловимого бага. После чего совершенно случайно найди место где вылазишь за пределы массива или обращаешься к неинициализированной памяти. Вот после этого станет понятно, что так жить нельзя. И вот все это безобразие размазанное по всему коду надо собрать в одном месте. И все проверки и инициализацию делать там. А где это в одном месте? Правильно написать собственный класс, там и конструктор есть для инициализации по умолчанию и [] перегрузить можно, что бы всякие проверки делать и деструктор, что бы за собой прибрать. А потом тебе захочется, что бы твой класс работал с разными типами данных и ты перепишешь его на шаблонах.

А теперь загляни в стандартную библиотеку. Поздравляю все это уже давно сделали за вас гораздо лучше и со множеством приятных плюшек. Тысячи программистов прошли этот путь за более чем 40 лет. Так зачем, зачем проходить этот путь еще раз? У вас, что есть запасная жизнь? Берите и пользуйтесь готовым. C++ имеет тысячи подходящих инструментов. Пользуйтесь ими. Так нет каждый новый адепт хватает кирку и лопату и бежит строить днепрогэс. Не надо построили уже до вас. Вы в стандартной библиотеки поищите оно там есть.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@vanyamba-electronics
Потому что массив в C/С++ - это просто указатель на область памяти. Программа должна эту память зарезервировать, а после использования - освободить.
Ответ написан
Комментировать
@lz961
можно так делать, если коленей не жалко
int n;
std::cin >> n;
{
    int a[n];
    // здесь работаем с массивом
}
// здесь массив a уже не доступен
Ответ написан
Комментировать
@anikavoi
Сущетвуют языки, в которых динамический массив есть:
https://nim-lang.org/docs/tut1.html#advanced-types...
Ответ написан
Комментировать
@MaratWantsToKnowALot
newbie
Попробуй вот так)
int arr[8];
int n;
cin >> n;
arr[8] = arr[n];
Дай массиву любой размер
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы