Ir ao conteúdo
  • Cadastre-se

C Retornar Matriz bidimensional apos chama de funcao


Posts recomendados

Numa formulação genérica, tenho uma função que coloca um valor numa matriz de strings; só como exemplo:

 char **matrizExemplo()

{

char **vet;

char tamVetor = 1;

 

vet = malloc(sizeof(char*)*tamVetor);

 

vet[0] = malloc(sizeof(char*)*10);

 

strcpy(vet[0], "teste");

 

printf("Dentro da funcao vet[0] e %s\n", vet[0]);

 

return vet; }

 

int main()

{

 

char **retorno;

 

retorno = matrizExemplo();

printf("Retorno e: %s\n", retorno[0]); return 0;

}

 

Consigo printar dentro da função o vet[0], mas ao retornar para a main ocorre falha de segmentação, onde estou errado?

Link para o comentário
Compartilhar em outros sites

O erro que vi no seu código é que você não usou free() para liberar a memória que foi alocada dinamicamente. Mas fora isso, no site onlinedb o código compilou e rodou normalmente sem falha de segmentação:

 

https://onlinegdb.com/r1SgOmgfX

 

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

char **matrizExemplo()
{
    char **vet;
    
    char tamVetor = 1;
    vet = malloc(sizeof(char)*tamVetor);
    vet[0] = malloc(sizeof(char)*10);
    strcpy(vet[0], "teste");
    
    printf("Dentro da funcao vet[0] e: %s\n", vet[0]);

    return vet;
}

int main()
{
    char **retorno;

    retorno = matrizExemplo();

    printf("Retorno e: %s\n", retorno[0]);
    
    free(retorno[0]);
    free(retorno);
    
    return 0;
}

 

(Leia minha assinatura abaixo para ver como postar códigos no fórum.)

Link para o comentário
Compartilhar em outros sites

Obrigado pelo contato! Então, esse codigo funciona sim, o problema e que estou com uma implementação aqui que da falha de segmentação, pode conferir pra mim aonde e o erro?

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "/opt/azulaoServer/headers/urls.h"


typedef struct endereco
{
  char logradouro[30];
  char numero[4];
  char bairro[20];
  char estado[2];
  char cidade[30];
  char cep[15];
  }Endereco;

typedef struct Cliente
    {

     char cpf[13];
    char realName[60];
    char sexo[11];
    char key[15];
    char data[11];
    Endereco endereco;

}Cliente;



   char **QuebrarStringCompleta(char *string)
  {

   char **linha;
   char *token;
   int tamVetor = 1;

   int i = 0;

          linha  = malloc(sizeof(char*)*tamVetor);

   linha[i] = malloc(sizeof(char**)*150);

   token = strtok(string, "\n");

   strcpy(linha[i], token);
   printf("primeira linha e: %s\n", linha[i]);

   i++;
   tamVetor++;


while (token != NULL)
    {


    linha = realloc(linha, sizeof(char*)*tamVetor);

   linha[i] = malloc(sizeof(char**)*150);

   token = strtok(NULL, "\n");

   strcpy(linha[i], token);
   printf("linha e: %s\n", linha[i]);

   i++;       
   tamVetor++;




            }
   printf("chegamos antes do return\n");
  return linha;
   }



  Cliente QuebrarStruct( char *string)
 {
    printf("a fincao foi chamda para quebrar a strict\n");

    printf("a string aqui e : %s\n", string);

Cliente cliente;
char *token;

token = strtok(string,",");
 printf("passou telo token, ele e %s\n", token);
    strcpy(cliente.cpf, token);

        printf("cliente.cpf e: %s\n", cliente.cpf);

        token = strtok(NULL,",");
printf("passou telo token e: %s\n", token);
    strcpy(cliente.realName, token);

        printf("cliente.realName e: %s\n", cliente.realName);


        token = strtok(NULL,",");
     printf("passou pelo token de separar o sexo\n");
    strcpy(cliente.sexo, token);
    printf("antes do printf\n");
    printf("sexo do cliente e: %s\n", cliente.sexo);

    /*
        token = strtok(NULL,",");

    strcpy(cliente.email, token);

    */
    printf("antes do tokrn, para separar a data\n");
        token = strtok(NULL,",");
        printf("passou pelo token de separar a data\n");

    strcpy(cliente.data, token);
        printf("data do cliente e: %s\n", cliente.data);

        printf("dados e, usuario: %s, nome real: %s, sexo: %s, data: %s\n", cliente.cpf,cliente.realName, cliente.sexo, cliente.data);
    return cliente;

}




char * LerDados(int flag)
{

Cliente cliente;

FILE *users;                // cria variável ponteiro para referenciar na 
                            // memoria um tipo de arquivo txt, no caso o
                            // user.txt





// url q se encontra o arquivo users.txt


// # define BUFFER_SIZE 1024 
// char buf [ BUFFER_SIZE ] ; 



// abrindo o arquivo com tipo de abertura w

 if (flag == 1)
 {  
  users = fopen(url, "r");

 }
 if (flag == 2)
{
users = fopen(urlprodutos,"r");

}

if (flag == 4)
{
    users = fopen(urladmin,"r");

}

if (flag == 5)
{
    users = fopen(urladminsKeys,"r");

}
    char *auxiliar;


// testando se o arquivo foi realmente criado
 if (users == NULL)
 {
    printf("Erro na abertura do arquivo!");
    return 1;
  }
  else
  {

    char *lido;



    int i = 0;
    char *string;
    int tamVetor = 0;

    int a = 0;
    char *string2;
    int tamVetor2 = 0;

            char *pch;
    char *token;
    char comparador[15];

        int flag = 1;

        strcpy(auxiliar,"");

    string = malloc(sizeof(char **) * tamVetor);


    string2 = malloc(sizeof(char **) * tamVetor2);

     while ((lido = fgetc(users)) != EOF)
    {
        if (lido == '#')
        {

            while ((lido = fgetc(users)) != EOF)
            {

    printf("lido tem: %c\n", lido);
                string[i] = lido;
                                    strcat (auxiliar, string);
//      printf("copiou\n");

                tamVetor++;

                string = realloc(string, sizeof(char *) * tamVetor);



                            }
                    }
             }
            printf("String e : %s\n", auxiliar);

    }


            return auxiliar;

}



int main ()

 {


 char *string;
 char **result;



 string = LerDados(1);

 printf("String e %s: ", string);


 result = QuebrarStringCompleta(string);

//result = matrizExemplo();
 printf("as linhas separadas sao: ");

 for(int i = 0; i < 5; i++)
{
  printf("%s\n", result[i]);   

} 
}

 

Link para o comentário
Compartilhar em outros sites

@Aislan Silva Costa Olá. Sem acesso ao arquivo "users.txt" não tem como testar o código.

Mas é bem provável q o problema esteja no modo como você está alocando memória nas funções do seu código. Sem dizer q também não está liberando a memória alocada.

Obs: É conveniente e até mesmo um boa prática d programação inicializar os ponteiros com o valor NULL, para q dessa forma eles não sejam "ponteiros selvagens" ou "ponteiros soltos", como também, após fazer uso dos ponteiros, fazer novamente q os mesmos apontem para NULL (Lugar nenhum) !

Daria p passar o arquivo ou o conteúdo dele para ver se dá p resolver o exercício?

adicionado 3 minutos depois
Em 26/06/2018 às 17:58, isrnick disse:

(Leia minha assinatura abaixo para ver como postar códigos no fórum.)

É. Ajudaria muito fazer uso do botão <> Code para postar um código

Até!

Link para o comentário
Compartilhar em outros sites

No compilador online está dando esse erro:

getc.c: No such file or directory

adicionado 6 minutos depois

Testa p ver se melhora um pouco. Sem poder ler o arquivo fica difícil:

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

typedef struct endereco
{
    char logradouro[30];
    char numero[4];
    char bairro[20];
    char estado[2];
    char cidade[30];
    char cep[15];
} Endereco;

typedef struct Cliente
{

    char cpf[13];
    char realName[60];
    char sexo[11];
    char key[15];
    char data[11];
    Endereco endereco;

} Cliente;



char **QuebrarStringCompleta(char *string)
{

    char **linha = NULL;
    char *token;
    int tamVetor = 1;

    int i = 0;

    linha  = malloc(sizeof(char*)*tamVetor);

    linha[i] = malloc(sizeof(char)*150);

    token = strtok(string, "\n");

    strcpy(linha[i], token);
    printf("primeira linha e: %s\n", linha[i]);

    i++;
    tamVetor++;

    while (token != NULL)
    {
        linha = realloc(linha, sizeof(char*)*tamVetor);

        linha[i] = malloc(sizeof(char)*150);

        token = strtok(string, "\n");

        strcpy(linha[i], token);
        printf("linha e: %s\n", linha[i]);

        i++;
        tamVetor++;
    }
    printf("chegamos antes do return\n");

    return linha;
}


Cliente QuebrarStruct( char *string)
{
    printf("a fincao foi chamda para quebrar a strict\n");

    printf("a string aqui e : %s\n", string);

    Cliente cliente;
    char *token = NULL;

    token = strtok(string, ",");
    printf("passou telo token, ele e %s\n", token);
    strcpy(cliente.cpf, token);

    printf("cliente.cpf e: %s\n", cliente.cpf);

    token = strtok(string, ",");
    printf("passou telo token e: %s\n", token);
    strcpy(cliente.realName, token);

    printf("cliente.realName e: %s\n", cliente.realName);


    token = strtok(string, ",");
    printf("passou pelo token de separar o sexo\n");
    strcpy(cliente.sexo, token);
    printf("antes do printf\n");
    printf("sexo do cliente e: %s\n", cliente.sexo);

    printf("antes do tokrn, para separar a data\n");
    token = strtok(string, ",");
    printf("passou pelo token de separar a data\n");

    strcpy(cliente.data, token);
    printf("data do cliente e: %s\n", cliente.data);

    printf("dados e, usuario: %s, nome real: %s, sexo: %s, data: %s\n", cliente.cpf,cliente.realName, cliente.sexo, cliente.data);
    return cliente;
}


char * LerDados(int flag)
{

    Cliente cliente;

    FILE *users;

    if (flag == 1)
    {
        users = fopen(url, "r");

    }
    if (flag == 2)
    {
        users = fopen(urlprodutos,"r");

    }

    if (flag == 4)
    {
        users = fopen(urladmin,"r");

    }

    if (flag == 5)
    {
        users = fopen(urladminsKeys,"r");

    }

    char *auxiliar = NULL;


    if (users == NULL)
    {
        printf("Erro na abertura do arquivo!");
        return 1;
    }
    else
    {
        char *lido;

        int i = 0;
        char *string;
        int tamVetor = 0;

        int a = 0;
        char *string2;
        int tamVetor2 = 0;

        char *pch;
        char *token;
        char comparador[15];

        int flag = 1;

        auxiliar = ""; // aqui o strcpy não funciona

        string = malloc(sizeof(char *) * tamVetor);

        string2 = malloc(sizeof(char *) * tamVetor2);

        while ((lido = fgetc(users)) != EOF)
        {
            if (lido == '#')
            {

                while ((lido = fgetc(users)) != EOF)
                {

                    printf("lido tem: %c\n", lido);
                    string[i] = lido;
                    strcat (auxiliar, string);
                    tamVetor++;
                    string = realloc(string, sizeof(char *) * tamVetor);

                }
            }
        }
        printf("String e : %s\n", auxiliar);
    }
    return auxiliar;
}



int main ()
{

    char *string = "Teste";
    char **result = NULL;

    string = LerDados(1);

    printf("String e %s: ", string);

    result = QuebrarStringCompleta(string);

    printf("as linhas separadas sao: ");

    for(int i = 0; i < 5; i++)
    {
        printf("%s\n", result[i]);

    }

    int i;

    for (i = 0; i < 5; i++)
        free(result[i]);

    free(result);

    string = NULL;

    result = NULL;

    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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