DarkDucke 0 Denunciar post Postado Dezembro 3, 2010 Olá pessoal, tenho uma matriz como abaixo: char matriz_teste[][10] = { "11111111", "22222222", "33333333" }; o que eu preciso fazer é alocar os valores dinamicamente, ou seja, tenho uma string com os valores char *base = "11111111;22222222;33333333"; preciso pegar os valores de "base" e colocar em matriz_teste char **matriz_teste; o que fiz foi isso: matriz_teste = (char **)malloc(3 * sizeof(char *)); for(i=0;i<3;i++) matriz_teste = (char *)malloc(10 * sizeof(char)); passei os valores assim strcpy(matriz_teste[0], "111111111"); strcpy(matriz_teste[1], "222222222"); strcpy(matriz_teste[2], "333333333"); mais ao jogar a matriz_teste na função que trabalha a matriz não funciona como se fosse declarada no modo padrão: char matriz_teste[][10] = { "11111111", "22222222", "33333333" }; alguem pode me da um help? Ps: ainda não fiz a separação da string "base" agradeço desde já! att Compartilhar este post Link para o post Compartilhar em outros sites
guidjos 65 Denunciar post Postado Dezembro 4, 2010 Pra quebrar e processar a string "11(...);22(...);33(...)", use strtok(). Poste seu código. Além disso, não faça casting no retorno da malloc(). Mais uma coisa... sizeof(char) == 1, sempre. Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Dezembro 6, 2010 guidjos me surgiu a dúvida referente ao seu post. pq você aconselhou não fazer casting no retorno da malloc()?? []s Compartilhar este post Link para o post Compartilhar em outros sites
guidjos 65 Denunciar post Postado Dezembro 8, 2010 O motivo principal pelo qual eu disse isso é porque é desnecessário, e isso faz com que os casts sejam nada mais que poluição visual. Além disso, se o programador não tiver incluído <stdlib.h>, que contém o protótipo da malloc(), o compilador deve assumir, pela definição da linguagem, que a função retorna int. Neste caso, se o cast não for feito, o compilador emitirá um warning (porque você estará tentando converter um int para um ponteiro). Ou seja, você notará que algo está errado (e muito errado, pois deveríamos sempre incluir <stdlib.h>). Se, contudo, você fizer o cast, o warning não surgirá (a conversão de tipos será forçada), e isso pode gerar problemas muito difíceis de se detectar. A especificação do C (pelo padrão TC3 - Committee Draft 2007) define que ponteiros para void podem ser convertidos para (ou de) qualquer outro tipo de ponteiro. Parafraseando a fonte: A pointer to void may be converted to or from a pointer to any incomplete or object type. A pointer to any incomplete or object type may be converted to a pointer to void and back again; the result shall compare equal to the original pointer. Além disso, faz sentido que não precisemos do cast. Isso porque, para fazer aritmética de endereços e referenciar unidades lógicas completas ("registros" de tipo definido), o compilador só precisa saber quantos bytes tem uma única unidade referenciada pelo ponteiro. No seguinte código: char *a; int *b; a aponta para um objeto de tamanho igual a 1 (por definição). Já b aponta para uma unidade de tamanho definido na implementação (varia de sistema para sistema). Vamos assumir que este tamanho seja 4 e considere o seguinte código: a = malloc(10); b = malloc(10 * sizeof *b ); A partir deste ponto, a[0] significa *(a + 0), a[1] significa *(a + 1), e assim por diante. b[1], contudo, significa *(b + 4). b[2] significa *(b + 8), e assim por diante. Portanto, ao derreferenciar um ponteiro usando a notação acima, o compilador usa *(endereço base + (deslocamento) * (tamanho do tipo referenciado)). Então b[3] == *(b + 3 * sizeof *b ). Assim, fica claro que não precisamos converter o tipo de endereço retornado por malloc(), já que para usá-lo, usaremos o ponteiro que o recebeu, e, nesta ocasião, o compilador já sabe quantos CHAR_BITs precisa avançar para incrementar um endereço em n unidades lógicas do tipo referenciado. Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Dezembro 10, 2010 Há entendi, vlw pela aula mano ;D []s Compartilhar este post Link para o post Compartilhar em outros sites