2014-10-11 2 views
0

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

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

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

+0

Массив не имеет переменной длины. 'n' - постоянное выражение, значение которого известно во время компиляции. –

+0

Объекты массива, объявленные со спецификацией класса статического или внешнего хранилища, не могут иметь тип переменной длины (VLA). см. вопрос. Почему размер статического массива не может быть переменным? [duplicate] –

+0

@R Sahu: Это неправильно. На языке C объекты 'const' не квалифицируются как константы времени компиляции. Это важное различие между C и C++ языками. – AnT

ответ

3

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

(см "static const" vs "#define" vs "enum" и Why doesn't this C program compile? What is wrong with this? более подробно.)

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

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

0

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

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

Этот код возникает ошибка:

 
storage size of ‘array’ isn’t constant static int array[n]; 
             ^

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

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

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

static int array[10]; 

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

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