Пример размера массива

У меня были проблемы с пониманием, почему

int n;

cin>>n;
int arr[n];

работает. Мне сказали, что этот код не должен выполняться, потому что значение 'n' может быть объявлено только во время выполнения и, следовательно, не должно компилироваться. Мне также сказали, что моя переменная 'n' должна быть постоянной. Как вы делаете его постоянным, когда есть "cin>>" (у меня проблемы с пониманием, как вписать константу). Я знаю, что код довольно прост, но я в конфликте из-за того, что мне сказали.

2 ответа

Решение

Согласно стандарту C++ ([dcl.array])

В декларации T D, где D имеет вид

D1 [ постоянное выражениеopt ] атрибут-спецификатор-seqopt

размер массива должен быть постоянным (или не указываться соответствующим инициализатором).

Однако некоторые разработчики компиляторов решили разрешить использование массивов переменной длины (VLA) для удобства программиста, чтобы поддерживать возможность компилировать код C на C++ (C допускает VLA начиная со стандарта C99), или какую-то гнусную цель, которую мы можем изучить только после того как они покорили мир.

Лучшее стандартное совместимое решение заключается в использованииstd::vector когда размер выделения не может быть известен во время компиляции.

int n;

if (cin>>n) // don't allocate unless n is valid
{
    vector<int> arr(n);
    // use arr 
}

Даже если VLA доступен, vector все еще более безопасное решение. vector выделяется из динамического хранилища, часто гораздо большего хранилища данных, чем автоматическое хранилище, и в случае неудачного выделения генерируется исключение. Поведение массива переменной длины, которое слишком велико для хранения, часто не определено и, вероятно, переполняет стек (обычная форма автоматического хранения), что приводит к множеству загадочных ошибок.

Выделение сырой памяти с new его следует избегать, так как он получает дополнительное управление (его необходимо удалить вручную в какой-то момент delete[]) и бухгалтерский учет (размер распределения неизвестен указателю) обязанностей. Программист, возможно, теперь также должен обратиться к правилам три и пять.

Люди больше не используют массивы, используют вектор или список, вам не нужно беспокоиться об их размерах, и есть множество полезных функций, доступных для обработки данных в них.

Другие вопросы по тегам