Основная проблема, которую я вижу в вашем коде, заключается в следующем:
int line[n];
Это называется VLA (массив переменной длины) и не поддерживается в C ++.Это допустимо в C. Большинство компиляторов все еще допускают такое поведение из-за того факта, что C ++ основан на C, но он не является допустимым кодом C ++.В предыдущем вопросе я узнал, что clang поддерживает назначенные инициализаторы, а gcc и vc ++ - нет.Причина в том, что некоторые компиляторы, такие как clang, по умолчанию поддерживают расширения c99.Я хочу сказать, что если код компилируется, это не значит, что он всегда прав.
Если вы скомпилируете аргумент -pedantic
, вы увидите, что компилятор предупреждает вас о том, что это функция C99,Посмотрите на пример rextester здесь .Из комментариев ниже, использование -pedantic-errors
в флагах компилятора вызовет ошибку.
Если вы знаете размер массива до выполнения, тогда вам следует использовать статический массив int line[4];
, ноесли нет, то вам нужно использовать динамический массив.std :: vector - это динамический массив, который также обрабатывает память для вас.Это простой в использовании и очень эффективный.std::vector<int> line;
Вы можете узнать больше о векторном контейнере здесь: http://www.cplusplus.com/reference/vector/vector/
Кстати, я попробовал ваш код в rextester, ideone и repl.it и получил те же результаты: 22 1
.Я думаю, что вы наблюдаете это неопределенное поведение.
Кроме того, вы можете квалифицировать int n
с constexpr
, и все будет хорошо.
constexr int n = 200;
int line[n]; //now it's ok.
Но это опять же означает, что вызнать размер массива во время компиляции.