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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top