matriz dinâmica Multidimensional
-
06-07-2019 - |
Pergunta
Eu preciso de uma matriz multidimensional de caracteres que é dinâmico em apenas uma dimensão ...
I tem que armazenar um par de cadeias com um comprimento de 10 (ou menos) carboniza cada, mas com um número variável de "pares".
A minha ideia era essa
char (*instrucao)[2][10];
O que me dá um ponteiro para uma 2x10 matriz de caracteres, mas isso não está funcionando corretamente quando eu faço algo como isto:
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, "() ");
}
Tendo strInstrucoes
como (abc,123) (def,456) (ghi,789)
, eu não matriz com 3 linhas de 2 pares cada assim:
abc | 123
def | 456
ghi | 789
mas é isso que eu estou ficando:
abc | 123
def | 45def | 45de
ghi | 789
O que é o caminho certo para fazer isso? Obrigado!
Solução
Você deve atribuir o ponteiro o novo endereço realloc
retornos
instrucao = realloc(instrucao, (i+1)*sizeof(char[2][10]));
Note que, para a verificação de erros, você pode desejar para atribuir a um novo ponteiro e verificar se há NULL
. Além disso, observe os parênteses - basicamente você acabou de adicionar i
em vez de multiplicar com o tamanho necessário. Facilmente supervisionado.
Note que não há nenhuma necessidade para o calloc
inicial. Apenas inicializar instrucao
para NULL
, e realloc vai se comportar como malloc
quando passou pela primeira vez um ponteiro nulo.
Outras dicas
Você faria muito melhor para encontrar uma biblioteca com um recipiente que irá atender às suas necessidades. Na pior das hipóteses, usando nenhum dos muito melhores bibliotecas, você pode ter duas matrizes distintas, cada uma delas metade holding do par.