PDA

Visualizza la versione completa : [C] Uso di malloc() e matrici di puntatori


Schumy
07-12-2007, 18:40
Ciao ragazzi, avrei bisogno di una matrice i cui elementi siano dei puntatori a char.
La sua dimensione deve essere N righe * 3 col, dove N varia a seconda dell'input...
Per allocare dinamicamente un vettore di N puntatori a char so che si fa cosi (se nn ricordo male):

char** vett;
vett = (char**) malloc( N * sizeof(char*) );

bene.....ora per creare le righe (o colonne) ?.

Grazie in anticipo a tutti coloro che mi risponderanno...: :ciauz:

duonovembre
07-12-2007, 22:08
non dovresti allocare riga per riga ogni volta che aggiungi una stringa??

Schumy
07-12-2007, 23:00
ciao duo, grazie per l'interessamento.

Non ho ben capito quello che vuoi dire, forse è probabile che tu creda che io abbia bisogno di una matrice di caratteri, cioè un carattere (un byte) per ogni elemento, ovvero un "char Mat[righe][colonne]"...
No, a me serve una matrice i cui elementi contengano dei puntatori (4 byte) a char, cioè
"char* Mat[r][c]", dove la dimensione delle righe "r" varia a seconda delle circostanze mentre quella delle colonne è nota, per me varrà 3;

faccio un esempio per far capire quello che ne voglio fare di questa matrice.

nel mio programma per N volte chiedo di inserire una "coppia" di parole, e mi farebbe comodo se potessi fare qlkosa del genere:

for (i=0; i<N; i++) {

printf("parola1:");
scanf("%s", mat[i][0]);
//parola1 va (cioè il suo puntatore) sulla i-sima riga e prima colonna

printf("parola2:");
scanf("%s", mat[i][1];
//parola2 va sulla i-sima riga e seconda colonna

//la terza colonna mi serve per altri valori che sono fortemente legati
//alla coppia di parole
}
prorpio per il fatto che vengono inserite a coppia mi piacerebbe inserirle una di fianco all'altra in una matrice...

cmq ho risolto (complicando un po il codice, ed una sua futura interpretazione) inserendole in un vettore di puntatori a char, per poi andarle a ripescare in una maniera meno elegante ma funzionante...

francamente nn so neanke se sta matrice si puo creare dinamicamente (ma mi sembrerebbe strano) e se tu sai qlkosa mi faresti un grandissimo piacere...

:ciauz:

ntd
08-12-2007, 11:03
Certo che si può allocare dinamicamente. Per allocare un char *matrice[c][r] devi:



matrice = (char ***) malloc (c*r*sizeof (char *));


Se cambia c o r devi riallocare l'intera struttura (perché deve essere contigua per definizione):



matrice = (char ***) realloc (matrice, c*r*sizeof(char *));


Però ho dei seri dubbi che il tuo scanf("%s", mat[i][0]) sia sano: quanto sopra alloca lo spazio per la matrice, non per le eventuali stringhe a cui punta ogni elemento della matrice.

Loading