Этот код на С должен потерпеть неудачу, но он работает.Это почему? - PullRequest
4 голосов
/ 05 августа 2010

Люди, я думаю, я выброшу все свои скромные знания. Посмотрите на этот код:

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.

Ответы [ 2 ]

16 голосов
/ 05 августа 2010

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

Из Википедия :

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

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

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

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