Вы изучаете C или C ++?
Ваш коллега имел в виду, что в своем коде вы делаете что-то отличное от того, что вы хотели. Это работает из-за некоторых дополнительных факторов. Потому что стандарты C / C ++ развиваются, как и компиляторы. Позвольте мне показать вам.
Статический массив
Когда вы начинающий, обычно рекомендуется придерживаться концепции, что «типизированный массив заданного размера компиляции» равен int arr[N]
, где N - это константа . Вы размещаете его в стеке и не управляете его памятью.
В C ++ 11 вы можете использовать constexpr (константное выражение), но все еще не является произвольной переменной.
В C ++ 14 вы можете использовать «простое выражение» для размера, но вы не должны много пробовать, прежде чем получить концепцию массива заранее. Кроме того, компилятор GCC предоставляет расширение для поддержки массивов переменного размера, это может быть объяснением того, «почему код работает вообще».
Примечание: массивы переменного размера не совпадают с динамическими массивами. Это не статические массивы из первой главы путеводителя по C / C ++.
Существует также современный подход - std::array<int, 10>
, но опять же, не начинайте с него.
Динамический массив
Когда вам нужно создать массив в runtime , все меняется. Прежде всего, вы выделяете его на heap и либо сами управляете его памятью (если этого не происходит, вы получаете утечку памяти, способ Pure C), либо используете специальные классы C ++, такие как std::vector
. Еще раз, векторы должны использоваться после ознакомления с массивами Pure C.
Ваш коллега, должно быть, имел в виду нечто подобное:
int* arr = new int[some_variable]; // this is dynamic array allocation
delete[] arr; // in modern C/C++ you can write "delete arr;" as well
Итак, ваш компилятор заставил его работать именно в этом случае, но вам определенно не следует полагаться на подход, который вы пробовали. Это не распределение массива вообще.
TL; DR:
- В C ++ массивы переменной длины недопустимы
- компилятор g ++ допускает массивы переменной длины, потому что C99 допускает их
- Помните, что C и C ++ - это два разных языка
- Кажется, кусок кода из вопроса не делает то, что вы хотели, чтобы он делал
- Как уже упоминалось, должно быть
arr[i] = i + 1
, вместо этого вы все время присваиваете один и тот же элемент массива