Spec-Zone.ru › GCC 11

Далее: Макросы с переменным числом аргументов., Предыдущее: Структуры без членов, Вверх: Расширения семейства языков C [Оглавление][Индекс]

6.20 Массивы переменной длины ¶

Массивы автоматической переменной длины разрешены в ISO C99, и в качестве расширения GCC их поддерживает в режиме C90 и в C++. Эти массивы объявляются как любые другие массивы автоматические, но с длиной, которая не является константным выражением. Память выделяется в момент объявления и освобождается, когда область действия блока, содержащего объявление, завершается. Например:

FILE *
concat_fopen (char *s1, char *s2, char *mode)
{
  char str[strlen (s1) + strlen (s2) + 1];
  strcpy (str, s1);
  strcat (str, s2);
  return fopen (str, mode);
}

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

В качестве расширения GCC поддерживает массивы переменной длины в качестве члена структуры или объединения. Например:

void
foo (int n)
{
  struct S { int x[n]; };
}

Вы можете использовать функцию alloca для получения эффекта, очень похожего на массивы переменной длины. Функция alloca доступна во многих других реализациях C (но не во всех). С другой стороны, массивы переменной длины более элегантны.

Существуют и другие различия между этими двумя методами. Память, выделенная с помощью alloca, существует до возврата содержащей функции. Память для массива переменной длины освобождается, как только заканчивается область действия имени массива, если вы также не используете alloca в этой области.

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

struct entry
tester (int len, char data[len][len])
{
  /* … */
}

Длина массива вычисляется один раз при выделении памяти и запоминается на время действия массива, если вы обращаетесь к ней с помощью sizeof.

Если вы хотите передать массив сначала, а длину затем, вы можете использовать объявление вперед в списке параметров — ещё одно расширение GNU.

struct entry
tester (int len; char data[len][len], int len)
{
  /* … */
}

‘int len’ перед точкой с запятой является объявлением параметра вперед, и оно служит для того, чтобы имя len стало известным, когда анализируется объявление data.

Вы можете записать любое количество таких объявлений параметров вперед в списке параметров. Они могут быть разделены запятыми или точками с запятой, но последнее должно завершаться точкой с запятой, за которой следуют «реальные» объявления параметров. Каждое объявление вперед должно соответствовать «реальному» объявлению по имени параметра и типу данных. ISO C99 не поддерживает объявления параметров вперед.

Далее: Макросы с переменным числом аргументов., Предыдущее: Структуры без членов, Вверх: Расширения семейства языков C [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/Variable-Length.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API