2009-12-08 3 views
8

Почему мы можем сделать это в c?Почему [n] принимается в c во время выполнения?

int n; 
scanf("%d",&n); 
int a[n]; 

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

Спасибо,

+0

Это также предусмотрено в качестве расширения по г ++, хотя VLA не является частью C++ (но будет частью C++ 0x). –

+0

Расширение C++ не включает поддержку ссылок на тип массива переменной длины; ни один из параметров функции не может быть ссылкой на тип массива переменной длины. (IBM C++) –

+2

Нет, он не будет частью C++ 0x. – 2009-12-08 11:41:05

ответ

6

I thought array is *al*located memory during load time but seems like the above example works during run-time.

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

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

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

9

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

+0

Это VLA (функция C99), почему вы не уверены? –

+0

Я сказал, что не был экспертом в C, потому что, хотя я знаю, что существует такая вещь, как VLA, я никогда не использовал их, и я не был на 100% уверен, что это то, о чем плакал. – zoul

0

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

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

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

extern int size; 
char buff1[size]; 

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

На компилятором я проверил это на (НКУ 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