Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
guidjos me surgiu a dúvida referente ao seu post.
pq você aconselhou não fazer casting no retorno da malloc()??
[]s
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.Há entendi, vlw pela aula mano ;D
[]s
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.