Размер массива во время выполнения без динамического выделения разрешен? - PullRequest
57 голосов
/ 10 апреля 2009

Я использую C ++ в течение нескольких лет, и сегодня я увидел некоторый код, но как это может быть совершенно законно?

int main(int argc, char **argv)
{
    size_t size;
    cin >> size;
    int array[size];
    for(size_t i = 0; i < size; i++)
    {
        array[i] = i;
        cout << i << endl;
    }

    return 0;
}

Составлено по GCC.

Как определить размер во время выполнения без new или malloc?

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

Как программировать даже на Deitel C ++ с. 261 состояние в соответствии с общей ошибкой программирования 4.5:

Для определения размера автоматических и статических массивов можно использовать только константы.

Просвети меня.

Ответы [ 7 ]

53 голосов
/ 10 апреля 2009

Это действительно в C99.

Стандарт C99 поддерживает массивы переменного размера в стеке. Возможно, ваш компилятор также решил поддержать эту конструкцию.

Обратите внимание, что это отличается от malloc и new. gcc выделяет массив в стеке, точно так же, как и в int array[100], просто настраивая указатель стека Распределение кучи не выполняется. Это очень похоже на _alloca.

19 голосов
/ 10 апреля 2009

Это известно как VLA (массивы переменной длины). Это стандартно в c99, но gcc допускает его в коде c ++ как расширение. Если вы хотите, чтобы он отклонял код, попробуйте поэкспериментировать с параметрами -std=standard, -ansi и -pedantic.

7 голосов
/ 10 апреля 2009

Это действительно только в C99. В следующий раз вы можете попробовать проверить код в надежном компиляторе .

4 голосов
/ 10 апреля 2009

Это действительный C99, это не допустимый C ++. Это одно из немногих различий между двумя языками.

0 голосов
/ 03 сентября 2015

Этот код работает в компиляторе GNU GCC.

#include<bits/stdc++.h>

int main(int argc, char **argv)

{
    size_t size;

   std:: cin >> size;

    int array[size];

    for(size_t i = 0; i < size; i++)

{

array[i] = i;

        std:: cout << i;

 }

    return 0;
}
0 голосов
/ 13 октября 2014

Массивы переменной длины (VLA) поддерживаются в стандарте C ++ 14, который был недавно принят и ожидает публикации.

0 голосов
/ 05 марта 2013

Вы можете динамически определять размер массива, если вы используете компилятор Dev-Cpp. Я пробовал и не получил ошибки, но на Visual C ++ и Visual Studio компиляторы это невозможно. Я думаю, причина в том, что dev-c ++ присваивает неинициализированный int положительное число и когда мы даем ему номер, он заменяется данным. но, возможно, другие компиляторы дают нулевые неинициализированные переменные.

...