Variable Length Arrays fanno parte del linguaggio C dal C99. Ma sono stati creati come funzionalità in C11 - il che significa che un'implementazione conforme a C11 non ha bisogno di fornirli (anche se praticamente tutte le implementazioni che supportano C99 forniscono certamente VLA in C11).
È possibile verificare se l'implementazione non fornisce VLA utilizzando la macro __STDC_NO_VLA__
(Se è definita in modalità di compilazione C99 o C11, l'implementazione non supporta VLA).
Quindi decidere una dimensione della matrice in fase di esecuzione è possibile in moderna C (> = C99) e il codice come il sotto va bene:
int s;
printf("Enter the array size: ");
scanf("%d", &s);
int a[s];
Una evidente svantaggio di Vlas è che se s
è abbastanza grande e la assegnazione di a
fallire coud. Peggio ancora, non c'è modo di verificare se l'allocazione non è riuscita e si verificheranno errori di runtime (ad esempio, segfault). È essenzialmente undefined behaviour. Quindi, , si desidera evitare VLA se la dimensione dell'array è troppo grande. Fondamentalmente, in caso di dubbio, andare per l'allocazione dinamica della memoria (vedi sotto).
Un altro problema, molto meno grave rispetto ad altri, con gli VLA è che hanno la durata di archiviazione automatica (ovvero "stack allocato"). Quindi, se si desidera qualcosa che dura per una durata più lunga, lo scope del blocco in cui viene dichiarato VLA, quindi VLA non sono di aiuto.
In C89, non c'è VLA. Quindi usare l'allocazione dinamica della memoria è l'unico modo. Sebbene ci fossero alcune estensioni non standard come alloca()
che è simile a VLA e presenta gli stessi svantaggi dei VLA).
int s;
printf("enter the array size: ");
scanf("%d",&s);
int *a = malloc(s * sizeof *a);
...
free(a);
Oh capisco. grazie. quindi tutti gli elementi dell'array si trovano ancora nello stack? – root
Sì, lo sono. Se ciò non funziona, usa malloc come suggerito in altre risposte. –