Статические массивы с переменной длиной

Является ли следующее законным?

const int n=10;
static int array[n];

Если да, то почему и как?

3 ответа

Решение

Обратите внимание, что на языке Си const объекты не квалифицируются как константы. Их нельзя использовать для построения константных выражений. В вашем примере кода n не является константой в терминологии языка Си. выражение n не является интегральным константным выражением в C.

(Смотрите "static const" против "#define" против "enum" и Почему эта программа на C не компилируется? Что не так с этим? Для более подробной информации.)

Это сразу означает, что ваша декларация array это попытка объявить массив переменной длины. Массивы переменной длины допускаются только как автоматические (локальные) объекты. После того, как вы объявите массив со статической продолжительностью хранения, размер должен быть выражением целочисленной константы, т.е. Ваш n не квалифицируется как таковой. Декларация не является законной.

Это причина, почему в языке Си мы преимущественно используем #define и / или enum ввести именованные константы, но не const объекты.

const int n=10;
static int array[n];

Этот код столкнется с ошибкой:

 размер хранилища 'array' не является постоянным static int array[n];
                                        ^

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

const в C не делает эту переменную доступной во время компиляции.

Такое утверждение не будет генерировать эту ошибку:

static int array[10];

Таким образом, заявление, которое вы написали, является недопустимым или содержит ошибку при компиляции программы.

Статические переменные должны быть выделены во время COMPILE, и, следовательно, их размер и значение инициализации, если таковые должны быть известны во время компиляции. Можно утверждать, что с помощью оптимизации времени компиляции n var будет / может быть заменено постоянным значением 10, и, таким образом, может быть возможным успешно скомпилировать этот конкретный случай.

Другие вопросы по тегам