Ir ao conteúdo
  • Cadastre-se

Dúvida com matriz dinâmica


DarkDucke

Posts recomendados

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 = malloc(3 * sizeof(int));

for(i=0;i<3;i++)

matriz_teste = malloc(10 * sizeof(int));

passei os valores assim

matriz_teste[0] = "111111111";

matriz_teste[1] = "222222222";

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

Link para o comentário
Compartilhar em outros sites

O erro está na alocação de memória e cópia de conteúdo.

Está alocando tamanho 'int', que imagino ser 32bits (depende do compilador e arquitetura da máquina), e o que você precisa é alocar 'char', que são 8 bits (1 byte).

A alocação para montar o vetor, também está errada, deve ser ponteiro de char (char *).

Para atribuição de string em variável, use a função 'strcpy()'.

Tente assim:


matriz_teste = malloc( sizeof(char *) * 3 );
for ( i = 0; i < 3; i++ )
matriz_teste[i] = malloc( sizeof(char) * 10 );

strcpy(matriz_teste[0], "111111111" );
strcpy(matriz_teste[1], "222222222" );
strcpy(matriz_teste[2], "333333333" );

Link para o comentário
Compartilhar em outros sites

O código que eu testei com o exemplo que eu te passei, e funcionou sem problema:


#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
char **matriz_teste;
int i;

matriz_teste = malloc( sizeof(char *) * 3 );

for( i = 0; i < 3; i++ )
matriz_teste[i] = malloc( sizeof(char) * 10 );

strcpy(matriz_teste[0], "111111111");
strcpy(matriz_teste[1], "222222222");
strcpy(matriz_teste[2], "333333333");

printf("matriz_teste[%d]: %s\n", 0, matriz_teste[0]);
printf("matriz_teste[%d]: %s\n", 1, matriz_teste[1]);
printf("matriz_teste[%d]: %s\n", 2, matriz_teste[2]);

for( i = 0; i < 3; i++ )
free(matriz_teste[i]);

free(matriz_teste);

return 0;
}

PS: Código testado em Windows (MinGW) e FreeBSD (GCC).

Link para o comentário
Compartilhar em outros sites

O código que eu testei com o exemplo que eu te passei, e funcionou sem problema:


#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
char **matriz_teste;
int i;

matriz_teste = malloc( sizeof(char *) * 3 );

for( i = 0; i < 3; i++ )
matriz_teste[i] = malloc( sizeof(char) * 10 );

strcpy(matriz_teste[0], "111111111");
strcpy(matriz_teste[1], "222222222");
strcpy(matriz_teste[2], "333333333");

printf("matriz_teste[%d]: %s\n", 0, matriz_teste[0]);
printf("matriz_teste[%d]: %s\n", 1, matriz_teste[1]);
printf("matriz_teste[%d]: %s\n", 2, matriz_teste[2]);

for( i = 0; i < 3; i++ )
free(matriz_teste[i]);

free(matriz_teste);

return 0;
}

PS: Código testado em Windows (MinGW) e FreeBSD (GCC).

Não sei porque mais aqui não funciona, já na parte

for( i = 0; i < 3; i++ )

matriz_teste = malloc( sizeof(char) * 10 );

da erro, pra não dar erro tenho que fazer

for(i=0; i<2; i++)

o limite tem que ser 2, se eu colocar 3 estoura...

beleza, faz tudo sem erro, que quando mando imprimir o resultado das linhas, vem caracteres estranhos, não vem o conteudo..

Obs: estou usando o compilador ARM7 para POS, não sei c tem alguma coisa,

mais que coisa complicada viu...

no final tenho que passar essa matriz pra uma função

Link para o comentário
Compartilhar em outros sites

Como eu já vinha comentando, compilador e arquitetura da máquina pode mudar a maneira de criar o programa sim, pois envolve registradores, modo de leitura da memória, etc, que podem ser diferentes.

Como você está usando outro compilador e arquitetura, então talvez eu não consiga te ajudar em alguns detalhes, como esse por exemplo.

Link para o comentário
Compartilhar em outros sites

Como eu já vinha comentando, compilador e arquitetura da máquina pode mudar a maneira de criar o programa sim, pois envolve registradores, modo de leitura da memória, etc, que podem ser diferentes.

Como você está usando outro compilador e arquitetura, então talvez eu não consiga te ajudar em alguns detalhes, como esse por exemplo.

não sei c ajuda a me ajudar, mais tava vendo outro exemplo assim:


int row;
int col;
char *TT = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

for (row = 0; row < 2; row++)
{
for (col = 0; col < 9; col++)
{
if (scanf(TT, "%c ", &menu_lines[row][col]) == 1)
{
//não faz nada
}
}
}

mais era de arquivo e não de char*

como poderia usar meu exemplo como o char TT que adicionei, creio que a alocação está correta, o problema ta no armazenamento..

obrigado novamente!

Link para o comentário
Compartilhar em outros sites

Aconselho você usar um 'debugger' para analisar passo-a-passo, ver o que está acontecendo.

Ir acompanhando o conteúdo de cada variável, o fluxo de execução, a pilha de execução, etc, assim facilitará bastante para você descobrir o que ocorre por trás da execução.

Pois como eu disse, o código que eu te passei funciona e a lógica está certa. Agora o negócio é analisar o que o compilador está fazendo, ver como ele funciona.

Uma outra coisa que facilita bastante pra poder te ajudar, seria você colar as mensagens de erros após compilação e/ou execução.

Link para o comentário
Compartilhar em outros sites

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!