2010-08-04 4 views
4

Люди, я думаю, я выброшу все мои скромные знания C. Посмотрите на этот код:Этот код C должен провалиться, но он работает. Почему это?

int main(int argc, char** argv, char** envp) 
{ 
    int aa; 

    srand(time(NULL)); 

    int Num = rand()%20; 

    int Vetor[Num]; 

    for (aa = 0; aa < Num; aa++) 
    { 
    Vetor[aa] = rand()%40; 
    printf("Vetor [%d] = %d\n", aa, Vetor[aa]); 
    } 
} 

Я думаю, что это должно бросить ошибку по двум причинам - во-первых, что я объявляя как Num и VETOR после выполнения команды (srand), второй, потому что я заявляю Vetor на основе Num, это не должно быть прав? потому что эти размеры массива не должны решаться во время выполнения, но во время компиляции?

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

Использование GCC.

+0

Что вы использовали, чтобы скомпилировать это? Если вы скомпилировали его с чем-то, что также компилирует C++, возможно, он просто сказал: «О, это законно, потому что C++ говорит, что это так». – corsiKa

+0

@TotalFrickinRockstarFromMars, но это не является законным C++. –

+0

@phresnel и что делает его не C++? – corsiKa

ответ

16

Это функции C99, и, похоже, ваш компилятор поддерживает их. Это все;)

От Wikipedia:

C99 представила несколько новых функций, многие из которых уже реализованы в виде расширений в нескольких компиляторов:

  • встроенные функции
  • приобщены деклараций и код, объявление переменной больше не ограничено областью действия файла или запуском составного оператора (блока)
  • несколько новых типов данных, в том числе долгого долгого Int, необязательных расширенных целочисленных типов, явный логический типа данных и комплексный типа к представляют собой комплексные числа
  • массивы переменной длиной
  • поддержки для одна линия комментариев начиная с //, как в BCPL или C++
  • новых библиотечных функций, таких как snprintf
  • и т.д. (more)
+0

О! Живя и учась! лучше прочитать спецификацию на C99, спасибо за ответ –

+1

Yup, даже 'sizeof' должен сообщить вам размер массива переменной длины, поэтому он больше не просто компиляция, он также должен иметь реализацию исполнения. – dreamlax

1

C99 поддерживает декларации в любом месте кода, а также VLA. Какой компилятор вы используете?

+0

спасибо за подсказку. Это GCC, только что узнал о том, что C99 догонит стандарты. –

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