Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C] matrice quadrata

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    80

    [C] matrice quadrata

    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.

  2. #2
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    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

  3. #3
    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.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    80
    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?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    80
    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!

  6. #6
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.