Вопрос по массивам С++
Почему нельзя задать размер статического массива обычной переменной, а только константой, например такой код не скомпилируется :
int SIZE = 10;
int arr[SIZE];
Ответы (1 шт):
Потому что этот массив СТАТИЧЕСКИЙ, т.е. его размер задаётся на стадии компиляции, а не выполнения. Если такой массив определён, как глобальная переменная (т.е., объявлен вне тела какой-либо функции, либо с модификатором 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;
}