Matriz dinámica multidimensional
-
06-07-2019 - |
Pregunta
Necesito una matriz multidimensional de caracteres que sea dinámica en una sola dimensión ...
Tengo que almacenar un par de cadenas con una longitud de 10 (o menos) caracteres cada una, pero con un número variable de "pares".
Mi idea era esta
char (*instrucao)[2][10];
Lo que me da un puntero a un conjunto de caracteres de 2x10, pero esto no funciona correctamente cuando hago algo como esto:
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, "() ");
}
Tener strInstrucoes
como (abc, 123) (def, 456) (ghi, 789)
, no matriculo con 3 líneas de 2 pares cada una como esta :
abc | 123
def | 456
ghi | 789
pero en cambio esto es lo que obtengo:
abc | 123
def | 45def | 45de
ghi | 789
¿Cuál es la forma correcta de hacer esto? Gracias!
Solución
Debe asignar al puntero la nueva dirección que realloc
devuelve
instrucao = realloc(instrucao, (i+1)*sizeof(char[2][10]));
Tenga en cuenta que para la comprobación de errores, es posible que desee asignar un nuevo puntero y verificar NULL
. También tenga en cuenta los parens: básicamente, acaba de agregar i
en lugar de multiplicar por el tamaño requerido. Fácilmente supervisado.
Tenga en cuenta que no es necesario el calloc
inicial. Simplemente inicialice instrucao
en NULL
, y realloc se comportará como malloc
cuando pase un puntero nulo por primera vez.
Otros consejos
Sería mucho mejor encontrar una biblioteca con un contenedor que satisfaga sus necesidades. En el peor de los casos, al no utilizar ninguna de las bibliotecas mucho mejores, podría tener dos matrices separadas, cada una de ellas con la mitad del par.