Array di lunghezza variabile
Una matrice di lunghezza variabile (VLA) è un tipo di dati del linguaggio di programmazione C . Si tratta di un campo ( array inglese ), la cui dimensione solo a runtime, i. H. variabile, è impostato.
Funzione e applicazione
In contrasto con il vettore classico , la cui dimensione è determinata al momento della traduzione, lo standard C99 introduce il concetto di dimensioni variabili degli array. Quando si definisce un campo, la sua dimensione può essere determinata da qualsiasi espressione intera.
- Vettore di esempio e VLA
void foo(unsigned int len) {
int vector[3] = { 14, 4, 7 }; /* initialisiertes Feld fixer Größe */
int vla[len]; /* VLA entsprechend dem Parameter len */
...
}
Va notato che i VLA non possono essere inizializzati (restrizione negli standard C, vedere §6.7.8 o §6.7.9) e la dimensione può essere specificata solo una volta durante la definizione. Inoltre, i VLA possono essere creati solo all'interno delle funzioni. Al di fuori delle funzioni, le dimensioni dei campi devono essere note anche in C99 al momento della traduzione. Come per tutte le variabili locali, l'ambito di un VLA inizia con la sua definizione e include il blocco di inclusione. Un grande vantaggio dei VLA è che non è necessario chiamare malloc()e per i campi temporanei free(); il compilatore prende in carico la richiesta e il rilascio della memoria richiesta. Poiché i VLA vengono creati sulla pila e non sul mucchio , il requisito di memoria è anche molto più efficiente. Inoltre, è possibile rinunciare alle dimensioni fisse degli array, che sono spesso causa di errori del software.
esempio
Il seguente esempio mostra un'applicazione tipica dei VLA.
- Esempio inverte la sequenza di caratteri di una stringa di qualsiasi lunghezza
#include <stdio.h>
#include <string.h>
char* reverse_string(char* in_out){
unsigned int len = strlen(in_out);
char tmp[len + 1]; // VLA für String und Nullterminierung
strcpy(tmp, in_out);
for (int i = 0; i < len; i++)
in_out[i] = tmp[len - i - 1];
return in_out;
}
int main(void) {
char tmp[] = "Hallo";
printf("%s\n", reverse_string(tmp));
return 0;
}
La funzione reverse_string()utilizza la variabile locale tmpcome VLA; questo occupa la stringa passata. La stringa viene quindi riscritta nel parametro di input / output in ordine inverso in_out. Naturalmente, possono anche essere generati VLA multidimensionali, come mostra l'esempio dello standard C11int a[n][6][m];
Effetti
sizeofCon i VLA, l' operatore deve essere valutato in fase di esecuzione, i. H. le meta informazioni devono essere generate per ogni VLA in fase di esecuzione. La definizione di VLA non deve essere tralasciata, qui gli standard C ne limitano l'uso goto. A differenza di C99, l'implementazione di VLA nei compilatori conformi a C11 è facoltativa. La disponibilità può essere __STDC_NO_VLA__richiesta tramite la definizione , che ha il valore intero 1, se i VLA non sono supportati.
Differenziazione da altri linguaggi di programmazione
I VLA sono specifici del C e non sono adottati dallo standard C ++. C ++ offre classi contenitore che abilitano i campi variabili. I linguaggi di programmazione APL e Perl , ad esempio, supportano i campi la cui dimensione può essere modificata in fase di runtime. Gli array in Java hanno una dimensione fissa. Poiché vengono creati dinamicamente, come con i VLA, le dimensioni possono essere impostate in fase di esecuzione.
Prove individuali
- ↑ Kernighan / Ritchie: Programming in C - With the C reference manual in German , Hanser 1990, 2nd edition
- ↑ a b Linguaggi di programmazione ISO / IEC9899-1999 - C
- ↑ a b c d Linguaggi di programmazione ISO / IEC9899-2011 - C
- ↑ Randy Meyers: The New C: Why Variable Length Arrays? , Dr. Dobb's, 1 ottobre 2001, online: http://www.drdobbs.com/the-new-cwhy-variable-length-arrays/184401444 . Estratto il 12 agosto 2014
- ↑ a b c Derek M. Jones: The New C Standard - An Economic and Cultural Commentary , Addison-Wesley Professional 2008, anche online: http://www.coding-guidelines.com/cbook/cbook1_2.pdf . Estratto il 12 agosto 2014
- ↑ Sito web del CERT Secure Coding Standard STR35-C . Estratto il 14 febbraio 2016