È sicuro usare array di lunghezza variabile?

Ho una preoccupazione per gli array a lunghezza variabile. Quando voglio allocare un array in modo dinamico, otterrò nulla, se non è ansible allocare memoria sufficiente e posso rispondere correttamente a questo nel mio programma. Con una matrice di lunghezza variabile non ho questa informazione. Cosa dovrei fare con questo?

Hai ragione che i VLA sono fondamentalmente sempre insicuri. L’unica eccezione è che se ti assicuri di non renderli mai più grandi di una dimensione, ti sentirai sicuro di creare una matrice di dimensioni fisse, e in tal caso potresti anche usare una matrice di dimensioni fisse. Esiste una class oscura di algoritmi ricorsivi in ​​cui i VLA potrebbero fare la differenza tra l’incapacità di risolvere il problema (overflow dello stack) e l’essere in grado di farlo, ma per la maggior parte, raccomanderei di non usare mai i VLA.

Ciò non significa però che i tipi di VLA siano inutili. Mentre VLA è cattivo / pericoloso, i tipi di puntatori a VLA sono estremamente utili. Consentono di disporre di array multidimensionali allocati dynamicmente (tramite malloc ) senza eseguire manualmente l’aritmetica delle dimensioni, come in:

 size_t n; double (*matrix)[n] = malloc(n * sizeof *matrix); 

per ottenere una matrice n-by-n indirizzabile come matrix[i][j] .