2017-02-11 6 views
1

Пожалуйста, посмотрите на 2 следующих программных сегментов:декларация массива во время выполнения и времени компиляции

int a,b; 
    cin>>a>>b; 
    int arr1[a*b]; 
    int arr2[a]; 

теперь, если я даю входное значение «а» = 100000 и «B» = 5, программа показывает сообщение об ошибке выполнения, потому что переполнения памяти я думаю. Теперь посмотрим на другой сегмент кода:

int arr1[500000]; 
    int arr2[100000]; 

Теперь, когда я объявляю массив такого же размера, как показано в коде выше, программа работает отлично. Почему это так?

+2

массивы переменной длины не поддерживаются в C++. – haccks

+2

Что сказал @haccks. C-style массивы и размеры 'std :: array' ДОЛЖНЫ быть известны во время компиляции. Вы можете использовать 'std :: vector' или динамически выделять массив. – Gambit

+2

* «Программа показывает ошибку времени выполнения из-за переполнения памяти, я думаю» * - Не перефразируйте сообщение об ошибке. Используйте copy и paste, чтобы добавить его в вопрос. –

ответ

1

Теперь, когда я объявляю массив заранее того же размера, который я объявил во время выполнения, программа работает нормально. Почему это так?

Поскольку массивы переменной длины (иначе говоря, VLA) являются недопустимыми стандартными C++-кодом.

Если вам нужна такая вещь, выделенный во время выполнения идиоматических C++ способ заключается в использовании std::vector:

int a,b; 
cin>>a>>b; 
std::vector<int> arr1(a*b); 
std::vector<int> arr2(a); 
+0

Здесь я не использую массив переменных размеров. Дело в том, что в обоих размерах сегмента программы оба массива одинаковы. Но первый сегмент показывает ошибку, но второй сегмент - нет. –

+0

@ShivaVerma _ «Но первый сегмент показывает ошибку» _ На самом деле это VLA, и он не поддерживается стандартным C++. –

+0

* «Я не использую массив переменных размера здесь». * - Да, вы. Скорее всего, вы используете g ++, который принимает VLA как расширение. С правильными флагами компилятора он также распечатает для них предупреждающее сообщение. Сделайте то, что все говорят вам и используют 'std :: vector'. –

Смежные вопросы