Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DarkDucke

matriz dinamica

Recommended Posts

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 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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.