Matrice dinamica multidimensionale
-
06-07-2019 - |
Domanda
Ho bisogno di una matrice multidimensionale di caratteri dinamica in una sola dimensione ...
Devo memorizzare una coppia di stringhe con una lunghezza di 10 (o meno) caratteri ciascuna, ma con un numero variabile di "coppie".
La mia idea era questa
char (*instrucao)[2][10];
Il che mi dà un puntatore a un array di caratteri 2x10, ma questo non funziona correttamente quando faccio qualcosa del genere:
char strInstrucoes[117], *conjunto = calloc(21, sizeof(char));
instrucao = calloc(1, sizeof(char[2][10]));
conjunto = strtok(strInstrucoes,"() ");
for(i = 0; conjunto != NULL; i++){
realloc(instrucao, i+1*sizeof(char[2][10]));
sscanf(conjunto,"%[^,],%s", instrucao[i][0], instrucao[i][1]);
printf("%s | %s\n", instrucao[i][0], instrucao[i][1]);
conjunto = strtok(NULL, "() ");
}
Avendo strInstrucoes
come (abc, 123) (def, 456) (ghi, 789)
, non ho una matrice con 3 linee di 2 coppie ciascuna come questa :
abc | 123
def | 456
ghi | 789
ma invece è quello che sto ottenendo:
abc | 123
def | 45def | 45de
ghi | 789
Qual è il modo giusto per farlo? Grazie!
Soluzione
Dovresti assegnare al puntatore il nuovo indirizzo realloc
restituisce
instrucao = realloc(instrucao, (i+1)*sizeof(char[2][10]));
Tieni presente che per il controllo degli errori, potresti voler assegnare un nuovo puntatore e controllare NULL
. Nota anche le parentesi: in pratica hai appena aggiunto i
invece di moltiplicare per la dimensione richiesta. Facilmente supervisionato.
Nota che non è necessario il calloc
iniziale. Basta inizializzare instrucao
su NULL
e realloc si comporterà come malloc
quando passa per la prima volta un puntatore null.
Altri suggerimenti
Faresti molto meglio a trovare una libreria con un contenitore che soddisfi le tue esigenze. Nel peggiore dei casi, utilizzando nessuna delle librerie molto migliori, potresti avere due array separati, ognuno dei quali contiene metà della coppia.