массив с постоянным размером (глобальный против стека) - PullRequest
4 голосов
/ 30 октября 2011

Когда я попробовал этот код, он работает:

const int i = 5;
int main() {
    int arry[i];
}

Даже если это не сработало:

const int i = 5;
int arry[i];
int main() {

}

Я прочитал все посты о массивах с постоянными размерами, но не могу понять, почему при объявлении arry в основном это работает.

Ответы [ 2 ]

9 голосов
/ 30 октября 2011

Проблема здесь в том, что const в C не приводит к истинной константе.

Когда вы пишете const int i = 5, вы получаете переменную только для чтения, а не константу.В C99 массив размером i является массивом переменной длины (VLA).VLA доступны только для переменных, выделенных стеком, поэтому вы видите ошибку компиляции.

Если вам нужен массив с глобальной областью действия, вам следует переключиться на макрос.

#define ARRAY_SIZE 5
int arry[ARRAY_SIZE];

Это верно, потому что5 - это литерал, который является истинной константой.

На самом деле, даже для массива автоматического хранения (т. Е. Локальной переменной, выделенной в стеке) вы должны избегать VLA, поскольку они вызывают накладные расходы времени выполнения.

1 голос
/ 30 октября 2011

Версия 2 просто недопустима C, поскольку i является переменной только для чтения, а не истинной константой времени компиляции. Если вы хотите, чтобы она работала, вы можете использовать mallocи free (или #define для размера).

Версия 1 использует массив переменной длины, который является стандартной функцией C99. gcc поддерживает этот синтаксис вкод до C99 в качестве расширения.Если вы скомпилировали свой код как C90 и включили -pedantic, вы получите предупреждение, что ISO C90 forbids variable length array ‘arry’.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...