Originariamente inviato da MItaly
Non sono equivalenti.
Ammettendo che la prima istruzione sia all'interno di una funzione (e non, ad esempio, in una struct o a livello globale):
- se n non è una costante ma è una variabile, la prima forma alloca un VLA (variable length array), supportato solo dal C99 in poi;
- la prima forma (che d'ora in poi chiamerò A) alloca l'array sullo stack, la seconda (B) nell'heap; per questo motivo:
- A può allocare solo array di dimensioni piuttosto ridotte (dato che lo stack è limitato a qualche MB su computer normali), mentre B in genere è limitata solo dalla memoria virtuale disponibile;
- se non è disponibile spazio a sufficienza, A in genere manda il programma in stack overflow (errore da cui non è possibile riprendersi, e che su Windows uccide il tuo programma senza alcun messaggio di errore), B semplicemente restituisce NULL;
- A ha scope limitato al blocco corrente (per cui appena esce di scope cessa di esistere automaticamente), mentre l'array restituito da B esiste fino a quando non viene richiamata la corrispondente free. Questo significa che nel primo caso non devi preoccuparti di deallocare niente, ma, ad esempio, la funzione non può restituire un puntatore all'array in questione.
- A è un "vero" array multidimensionale, per cui per accedere all'elemento i,j scriverai semplicemente matrix[i][j]; B restituisce un puntatore che puoi usare come un array monodimensionale, per cui per accedere all'elemento i,j dovrai fare il conto "manualmente" (scriverai matrix[i*m+j])
Grazie! sei stato molto chiaro!