to the top
close form

Заполните форму в два простых шага ниже:

Ваши контактные данные:

Шаг 1
Поздравляем! У вас есть промокод!

Тип желаемой лицензии:

Шаг 2
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности
close form
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Бесплатная лицензия PVS-Studio для специалистов Microsoft MVP
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Мне интересно попробовать плагин на:
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
check circle
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

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

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

28 Фев 2023

Массив переменной длины (a variable-length array) — это массив, длина которого вычисляется на этапе исполнения программы. Несмотря на сбивающее с толку название, длина такого массива не может измениться во время исполнения программы после его декларации. Массив, длина которого может измениться во время исполнения программы, называется массивом с динамической длиной.

Массивы переменной длины опционально доступны в языке C, начиная со стандарта C99, и обязательны к реализации, начиная с C23. В C++ массивы переменной длины доступны только в качестве нестандартных расширений (например, GCC). Вместо них можно использовать нестандартную функцию alloca для выделения памяти на стеке или стандартный контейнер std::vector для управления памятью на куче.

Массив переменной длины декларируется следующим образом:

void foo()
{
  size_t n = ....;
  // ....
  int32_t arr[n];
  ....
}

Размер массива вычисляется во время исполнения при декларации массива. Заметим, что последующее изменение переменной n не повлияет на размер уже задекларированного массива arr:

size_t n = 3;
int32_t arr[n]; // sizeof(arr) == 12
n = 7;          // sizeof(arr) == 12

В зависимости от реализации, массив переменной длины может иметь автоматическое или динамическое время жизни. Если массив имеет автоматическое время жизни, то он аллоцируется на стеке. Если массив имеет динамическое время жизни, то он аллоцируется на куче. В обоих случаях массив деаллоцируется при выходе из области видимости. В случае, если массив переменной длины аллоцируется на стеке, есть опасность переполнить стек, задав слишком большой размер массива.

Массив переменной длины также может быть объявлен как параметр функции. Размер может быть указан через '*' (такое разрешено только при декларации формальных параметров и только в прототипе функции), в этом случае массив имеет неуточненный размер. Пример объявления:

int sum(size_t n, int arr[*]);

При передаче массива переменной длины он также, как и обычные массивы, передаётся через указатель. Поэтому sizeof(arr) == sizeof(int *).

Рассмотрим пример использования массива переменной длины. Допустим, нам нужно вычислить сумму произвольного количества чисел. Поскольку на этапе компиляции количество чисел неизвестно, используем массив переменной длины:

int32_t get_int32_t();
int32_t sum_impl(size_t, int32_t arr[*]);

int32_t sum_impl(size_t n, int32_t arr[n])
{
  int32_t sum = 0;
  for (size_t i = 0; i < n; ++i)
  {
    sum += arr[i];
  }

  return sum;
}

int32_t sum(size_t n)
{
  int32_t array[n];
  for (size_t i = 0; i < n; ++i)
  {
    array[i] = get_int32_t();
  }
  
  return sum_impl(n, array);
}

В этом примере аргумент int32_t arr[n] эквивалентен int32_t *arr. Такую форму записи указателя используем, чтобы человеку, читающему код, было ясно, что в качестве второго аргумента функции ожидается массив переменной длины, а не простой указатель.

Популярные статьи по теме
Хорошо ли ChatGPT ищет ошибки в коде?

Дата: 02 Мар 2023

Автор: Артём Ровенский

Нейросети всё больше вливаются в привычный мир, пытаясь упростить нам жизнь. Тот же ChatGPT вызвал бурю обсуждений в интернете. Чат бот способен писать тексты, код, рефераты и песни. Он даже умеет ис…
Обзор плагина PVS-Studio для Visual Studio Code

Дата: 02 Фев 2023

Автор: Андрей Москалёв

Благодаря новому плагину PVS-Studio преимущества статического анализа теперь доступны и при работе с редактором Visual Studio Code. В этой статье мы разберём использование плагина от этапа установки …
Изменения в PVS-Studio, о которых полезно знать

Дата: 31 Янв 2023

Автор: Сергей Васильев

В этой статье расскажу о том, что появилось в PVS-Studio за последние три года, и чем это полезно пользователям анализатора. Статья модульная: можно не читать от начала до конца, а посмотреть только …
C++ — язык 2022 года. Почему так, и что с другими языками?

Дата: 20 Янв 2023

Автор: Сергей Васильев

C++ становится языком 2022 года по версии TIOBE, обгоняя Python. Rust, C#, Go и прочие — далеко позади. Странно? Сейчас разберёмся.
PVS-Studio в 2022 году

Дата: 19 Янв 2023

Автор: Полина Алексеева

На дворе январь 2023, а значит, самое время подвести итоги уже прошлого 2022 года. Мы расскажем, чем занимались, и покажем, что нового появилось в анализаторе за это время. Давайте вместе взглянем на…

Комментарии (0)

Следующие комментарии next comments
close comment form
Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо