Newsgroup: it.comp.lang.c
Titolo: FAQ 9 - Dichiarare un vettore con un numero di elementi arbitrario

Ecco la seconda domanda della giornata. Lo scopo è quello di spiegare come
creare e usare un vettore di cui si conosceranno le dimensioni solo a
runtime.
Ovviamente qui si parla delle amatissime malloc() e free(). Sarebbe bello
avere un pezzo di "codice tipo" su come creare questo oggetto
(preferibilmente una matrice) e anche un elenco di avvertimenti su come NON
usare malloc() (a meno che lo scopo non sia quello di mandare la macchina in
crash! ;-))
Grazie
Marco
PS: FAQ provvisorie: 
http://digilander.iol.it/shiny77/index.htm
--
Marco Coppo
University Of Sheffield

 e anche un elenco di avvertimenti su come NON usare malloc()
Mi vengono in mente due suggerimenti principali:
1. Mai perdere il riferimento al puntatore per il quale č stata allocata
memoria. Es.:
T *p = malloc( n * sizeof( T ) );
p = pippo;     // Errore! Non č piů possibile deallocare p!
2. Ricordarsi sempre di deallocare la memoria quando non serve piů.
EMG

 Ovviamente qui si parla delle amatissime malloc() e free(). Sarebbe bello
in genere per allocare una matrice dinamica (dim1,dim2) di char  faccio cosi':
char **Mat = NULL;
int     i = 0;
/*        ALLOCAZIONE    */
if    ( !(Mat = malloc( dim1 * sizeof(char *) ))    )
      sprintf( stderr,"Errore allocazione matrice\n" );
else
      for    ( i = 0;i < dim1; i++ )
               if    ( !( Mat[i] = malloc( dim2 ) )  )
                      sprintf( stderr,"Errore allocazione matrice\n" );
/*    DEALLOCAZIONE    */
      for    ( i = 0;i < dim1; i++ )
               free( Mat[i] );
    free( Mat );
Ps: La deallocazione si intende valida se tutti gli elementi sono stati allocati
correttamente.
Non e' provata,qundi non escludo qualche cappella :)
Ivan Molella


Infatti non sprintf(......) ma fprintf(.....)
Ivan Molella

 Infatti non sprintf(......) ma fprintf(.....)
Eh, eh, non è un problema! Fin lì sono in grado di rimediare ;-)
Grazie a tutti e due. Comparirà sulle FAQ probabilmente nella versione di
domani.
Ciao ciao


     int ( *p )[ 10 ] = malloc( 100 * sizeof( int ) );
Mi sembra di notare una certa influenza di C++ in queste righe.... mi sembra
che in C anche nell'ultima versione dello standard non sia possibile
dichiarare variabili nel punto in cui servono.
O si tratta della mia solita cantonata?
ciao
Marco

 O si tratta della mia solita cantonata?
No, no, hai ragione. Solo che quelli erano solo esempi staccati e non
codice compilabile. O sbaglio? Comunque correggi pure tutto quello che
c'è da correggere.
EMG

 c'è da correggere.
Si erano esempi staccati, ma li ho comunque finiti e compilati per testarli
(buona fede ovviamente). Solo che al compilatore andavano bene essendo C++.
Però mi sembravano "strani"...;-)
Ok io correggo, ma poi avrei piacere che anche voi deste ancora un'occhiata
al lavoro. Cosa pensi che sia meglio: postare la versione definitiva di ogni
risposta o indirizzare la gente sul sito?
Come ha fatto Paolo Marotta per il C++?
Grazie.
Ciao


 Come ha fatto Paolo Marotta per il C++?
Proprio ieri ha postato una versione aggiornata. Quindi la versione
definitiva dovresti postarla almeno una volta e poi se ne darà solo
l'indirizzo.
EMG