почему [n] принят в c во время времени выполнения?

Я отмечаю некоторых людей, предлагающих один выполненный cpan под sudo. Это раньше было необходимо для установки в системный каталог, но современные версии оболочки CPAN позволяют Вам настраивать его для использования sudo всего для установки. Это намного более безопасно, так как это означает, что тесты не работают как корень.

, Если у Вас есть старая оболочка CPAN, просто установите новый cpan ("устанавливают CPAN"), и когда Вы перезагружаете оболочку, это должно предложить Вам настраивать эти новые директивы.

В наше время, когда я нахожусь в системе со старым CPAN, первая вещь, я делаю обновить оболочку, и настраивать его, чтобы сделать это так я могу сделать большую часть своей работы cpan как обычный пользователь.

кроме того, я настоятельно рекомендовал бы, чтобы пользователи Windows занялись расследованиями земляника Perl . Это - версия Perl, который прибывает упакованный с предварительно сконфигурированной оболочкой CPAN, а также компилятором. Это также включает некоторые твердые к компиляции модули Perl с их внешними зависимостями библиотеки C, особенно XML:: Синтаксический анализатор. Это означает, что можно сделать то же самое как любой пользователь Perl когда дело доходит до установки модулей, и вещи склоняются к "просто работе" намного чаще.

8
задан Quintin Robinson 8 December 2009 в 05:40
поделиться

4 ответа

Я думал, что массив - это * al * расположенная память во время загрузки, но похоже, что приведенный выше пример работает во время выполнения.

Да, обычные массивы, такие как [<размер>] выделяется память во время загрузки, она есть в C89, а также существует в C99.

Но в фрагменте кода int a [n]; - это переменная длина Массив или VLA для краткости. VLA в C99 определяются так же, как и любой другой массив, за исключением того, что длина не обязательно должна быть константой времени компиляции.

Приличную статью о необходимости VLA можно найти здесь: http://www.ddj.com/cpp/184401444 :)

6
ответ дан 5 December 2019 в 07:35
поделиться

Учитывая, как написан ваш код (в частности, у вас есть инструкция), это должен быть код внутри функции.

Хотя я не уверен, что это строго требуется в spec, внутри функции все автоматические (т.е. функциональные, а не статические) массивы помещаются в стек. Таким образом, независимо от того, есть ли у вас обычный массив или VL, память выделяется во время выполнения.

Память для неавтоматических массивов не обрабатывается во время выполнения, поэтому не поддерживайте VLA. Если вы попытаетесь скомпилировать следующий код:

extern int size;
char buff1[size];

void doit(int x)
{
    static int buff2[x];
    int buff3[x];
}

На компиляторе, на котором я это тестировал (gcc 4.2.1), я получил следующие ошибки:

moo.c:2: error: variably modified ‘buff1’ at file scope
moo.c: In function ‘doit’:
moo.c:6: error: storage size of ‘buff2’ isn’t constant
0
ответ дан 5 December 2019 в 07:35
поделиться

Я не специалист в C, но это может быть массив переменной длины , добавленный C99 и , поддерживаемый GCC , например. GCC выделяет память для такого массива в стеке, поэтому он автоматически освобождается, когда вы возвращаетесь из функции.

9
ответ дан 5 December 2019 в 07:35
поделиться

Массивы переменной длины не найдены в C89, но являются новой функцией в C99.

7
ответ дан 5 December 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: