Каковы различные способы инициализации размера массива с помощью пользовательского ввода в c ++ - PullRequest
2 голосов
/ 07 апреля 2019

Мне было интересно, каковы некоторые альтернативы выполнению следующего фрагмента кода в c ++.

int i;
cin >> i;
int arr[i];

Я недавно начал изучать конкурентное программирование и пытаться узнать больше.

РЕДАКТИРОВАТЬ: Для тех комментариев о том, что это не cpp. Он успешно компилируется с make-файлом, который я использую в своем классе, который использует gcc -std=c++11 -o a.exe main.cpp, и возвращается к консоли, когда я ввожу длину 1

array length: 1

Ответы [ 3 ]

11 голосов
/ 07 апреля 2019

Вы должны использовать std::vector вместо этого в C ++, например,

int i;
cin >> i;
std::vector<int> arr(i);

BTW: VLA не поддерживается стандартом C ++.Также см. Массив переменной длины (VLA) в компиляторах C ++

3 голосов
/ 07 апреля 2019

Один способ:

int i = 0;

cin >> i;

auto arr = std::make_unique<int[]>(i); // #include <memory>
        // Or: std::make_shared<int[]>(i);

Другой способ - использование std::vector:

int i = 0;

cin >> i;

std::vector<int> arr(i); // #include <vector>
1 голос
/ 07 апреля 2019

Ваш код не на C ++.Он использует функцию языка C (из версии C99 стандарта C), называемую «массивы переменной длины», где массивы в стеке могут иметь длину, определенную во время выполнения.

Массивы переменной длинысчитается опасным и считается довольно плохой идеей;см .:

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

Если вы компилируете свой код, говоря компилятору принимать только код, совместимый со стандартом, это не удастся: gcc -std=c++11 -pedantic-error. Попробуйте это на GodBolt .

В C ++ размер массива устанавливается во время компиляции , точка.Как и другие пользователи, вы можете использовать динамическое выделение, чтобы получить непрерывную область определенной продолжительности в памяти, на ваш выбор размера: используя std::vector, std::unique_ptr, std::shared_ptr или даже простое выделение с new (хотя последнее не рекомендуется).

...