Вопрос по массивам С++

Почему нельзя задать размер статического массива обычной переменной, а только константой, например такой код не скомпилируется :

int SIZE = 10;
int arr[SIZE];

Ответы (1 шт):

Автор решения: LShadow77

Потому что этот массив СТАТИЧЕСКИЙ, т.е. его размер задаётся на стадии компиляции, а не выполнения. Если такой массив определён, как глобальная переменная (т.е., объявлен вне тела какой-либо функции, либо с модификатором static), то его размер добавляется к общему размеру всех непроинициализированных глобальных переменных программы, память под эти переменные выделяется системой целиком на стадии загрузки. По-этому в рантайме размеры подобных массивов изменить уже нельзя, компилятору нужно знать их заранее, а значит в качестве них допустимы только константы.

Однако, если же массив определяется, как локальная переменная какой-либо функции, то поскольку выделение памяти под него в стеке (вместе с другими локальными переменными) осуществляется во время выполнения, современные компиляторы, как например GCC, позволяют задавать размер таких массивов динамически, в виде других переменных. Например, следующий код рабочий (проверил в GCC):

void func(int size)
{
    char arr[size];
    arr[size-1] = 0;
}

А вот этот код, по указанным выше причинам, уже не скомпилируется:

void func(int size)
{
    static char arr[size];
    arr[size-1] = 0;
}
→ Ссылка