Variable Length Array
# Variable Length Array

Ein Variable Length Array (VLA) ist ein Datentyp der Programmiersprache C. Es handelt sich um ein Feld (englisch Array), dessen Größe erst zur Laufzeit, d. h. variabel, festgelegt wird.

## Funktionsweise und Anwendung

Im Gegensatz zum klassischen Vektor, dessen Größe zum Zeitpunkt der Übersetzung festgelegt wird, führt der C99-Standard das Konzept variabler Array-Größen ein. Bei der Definition eines Feldes kann dessen Größe durch einen beliebigen ganzzahligen Ausdruck bestimmt werden.

### Beispiel Vektor und VLA

Dabei ist zu beachten, dass VLAs nicht initialisiert werden können (Einschränkung in den C-Standards, vgl. §6.7.8 respektive §6.7.9) und die Größe nur einmalig bei der Definition festgelegt werden kann. Darüber hinaus können VLAs nur innerhalb von Funktionen angelegt werden. Außerhalb von Funktionen müssen Feldgrößen auch in C99 zum Zeitpunkt der Übersetzung bekannt sein. Der Gültigkeitsbereich eines VLAs beginnt wie bei allen lokalen Variablen mit dessen Definition und umfasst den umschließenden Block. Ein großer Vorteil von VLAs ist, dass für temporäre Felder der Aufruf von malloc und free wegfällt; der Compiler übernimmt die Anforderung und Freigabe des erforderlichen Speichers. Da in der Regel VLAs auf dem Stack und nicht auf dem Heap angelegt werden, ist die Speicheranforderung auch erheblich effizienter. Außerdem kann auf feste Array-Größen, die häufig Ursache für Softwarefehler sind, verzichtet werden.

### Beispiel

Das folgende Beispiel zeigt eine typische Anwendung von VLAs.

#### Beispiel Zeichenfolge eines beliebig langen Strings umkehren

Die Funktion reverse_string verwendet die lokale Variable tmp als VLA; dieses nimmt den übergebenen String auf. Im Anschluss wird der String in umgekehrter Reihenfolge wieder in den Ein-/Ausgabeparameter in_out zurückgeschrieben. Selbstverständlich lassen sich auch mehrdimensionale VLAs generieren, wie das Beispiel aus dem C11-Standard zeigt int a[n][6][m];

### Auswirkungen

Der Operator sizeof muss bei VLAs zur Laufzeit ausgewertet werden, d. h. für jedes VLA muss Meta-Information zur Laufzeit generiert werden. Die Definition von VLAs darf nicht übersprungen werden, hier schränken die C-Standards die Benutzung von goto ein. Im Gegensatz zu C99 ist die Implementierung von VLAs bei C11-konformen Compilern freigestellt. Die Verfügbarkeit kann über das Define __STDC_NO_VLA__ abgefragt werden, das den Integerwert 1 aufweist, sofern VLAs nicht unterstützt werden.

## Abgrenzung zu anderen Programmiersprachen

VLAs sind C-spezifisch und werden nicht vom C++-Standard übernommen. C++ bietet Container-Klassen, die variable Felder ermöglichen. Die Programmiersprachen APL und Perl unterstützen beispielsweise Felder, deren Größe zur Laufzeit verändert werden kann. Arrays in Java haben eine feste Größe. Da sie dynamisch angelegt werden, können wie bei VLAs die Größen zur Laufzeit festgelegt werden.