Ciao a tutti,
volevo sapere se per allocare spazio per una matrice nxn (qualsiasi tipo di dato) queste due modalità sono equivalenti:
matrix[n][n];
malloc(n*n*sizeof());
grazie.
Ciao a tutti,
volevo sapere se per allocare spazio per una matrice nxn (qualsiasi tipo di dato) queste due modalità sono equivalenti:
matrix[n][n];
malloc(n*n*sizeof());
grazie.
Non e' la stessa cosa.
Nel primo caso l'allocazione di memoria e' statica.
Nel secondo caso la memoria viene assegnata dinamicamente a runtime.
esempio di uno che ha avuto problemi con questi due tipi di allocazioni:
http://forum.html.it/forum/showthrea...readid=1547134
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])
Amaro C++, il gusto pieno dell'undefined behavior.
Ok,quindi se la dimensione della matrice viene determinata in fase di esecuzione del programma, non possiamo usare un array statico, dal momento che la dimensione di un array statico va decisa in fase di scrittura del programma, e dobbiamo utilizzare l'allocazione dinamica, giusto?
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!
Amaro C++, il gusto pieno dell'undefined behavior.