Масив змінної довжини (, VLA) — у програмуванні це масив, довжина якого визначається під час виконання програми (), а не під час компіляції.
Мови програмування, що підтримують масиви змінної довжини, включають Ada, ALGOL 68, APL, C#, C# (як unsafe-масиви розміщені у стеку), COBOL, Fortran 90, J та Object Pascal. Підтримку VLA було введено у стандарті C99, однак у C11 її перевели до категорії необов'язкових можливостей.ISO 9899:2011 Programming Languages – C 6.7.6.2 4. На деяких платформах VLA раніше можна було реалізувати за допомогою alloca() або подібних функцій.
C++ не підтримує VLA, оскільки в ньому підтримується RAII для колекцій. Хоча в GCC та Clang можна включити VLA як розширення.
Динамічні масиви, загалом є кориснішими за VLA, оскільки вони також підтримують зміну розміру масиву після створення. З цієї причини багато мов програмування (JavaScript, Java, Python, R тощо) підтримують лише динамічні масиви. Навіть у мовах, які підтримують VLA, часто рекомендується уникати використання таких масивів, розміщених у стеку, а натомість застосовувати (розміщені в купі) динамічні масиви.
C Наведена нижче функція мовою C99 виділяє масив змінної довжини заданого розміру, заповнює його числами з рухомою комою, а потім передає його іншій функції для обробки. Оскільки масив оголошений як автоматична змінна, термін його існування закінчується після завершення виконання функції readAndProcess().
float readAndProcess(int n) { float vals[n];
for (int i = 0; i < n; ++i) { scanf("%f", &vals[i]);
return process(n, vals); }
У C99 параметр довжини повинен передувати параметру масиву змінної довжини в оголошеннях функцій. У C11, якщо підтримка VLA відсутня, визначається макрос .§ 6.10.8.3 of the C11 standard (n1570.pdf) Стандарт C23 знову зробив типи VLA обов'язковими. Необов'язковим залишається лише створення об'єктів VLA з автоматичною тривалістю зберігання.§ 6.10.9.3 of the C23 standard (n3054.pdf) Компілятор GCC підтримував VLA як власне розширення ще до появи стандарту C99; це розширення також поширюється на його діалект C++.
C# До C# 7.2, був потрібен вказівник на "unsafe" масив. Ключове слово "unsafe" спричиняло маркування всієї збірки як "unsafe".
unsafe void DeclareStackBasedArrayUnsafe(int size) { int* p = stackalloc int[size]; p = 123; }
В C# 7.2 та вище можна обійтись без "unsafe", використовуючи клас System.Span<T>.
using System;
void DeclareStackBasedArraySafe(int size) { Span<int> a = stackalloc int[size]; a = 123; }
Примітки