Массивы переменного размера в C - PullRequest
6 голосов
/ 28 июня 2009

Я думаю, мой вопрос, является ли следующее действительным C

int main(void) {
  int r = 3;
  int k[r];
  return 0;
}

Если так, то кому-нибудь интересно объяснить, почему он не работает в компиляторе C Microsoft, но в GCC и когда он был добавлен в стандарт C.

Спасибо

Ответы [ 5 ]

13 голосов
/ 28 июня 2009

Это в C99. MSVC поддерживает только C89.

9 голосов
/ 28 июня 2009

В стандарт C99 добавлены массивы переменной длины, но другие поставщики, такие как GCC, добавили их намного раньше.

4 голосов
/ 29 июня 2009

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

void foo(int n)
{
    int bar[n];
    .
    .
}

Здесь нет явной проверки ошибок. Большой n может легко вызвать проблемы.

3 голосов
/ 28 июня 2009

Это расширение GCC, которое не поддерживается текущим MSVC. Вы можете легко заменить его в MSVC на _alloca (выделение стека, которое не требует ручного освобождения со стороны программиста):

#include <malloc.h>

...

int *k = (int *)_alloca(sizeof(*k)*r);
0 голосов
/ 25 октября 2009

Это расширение GCC, которое не поддерживается текущим MSVC. Вы можете легко заменить его в MSVC на _alloca (выделение стека, которое не требует ручного освобождения со стороны программиста)

Да, но оно ограничено 1 МБ

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