Ir ao conteúdo
  • Cadastre-se

C Dificuldade com ponteiros e estruturas


paulopimenta6

Posts recomendados

Olá pessoal,

 

Estou estudando linguagem C e fiquei com dúvida com relação a ponteiros e estruturas e isso gerou um erro de segmentação em meu código. Criei uma função que recebe um estrutura e um valor constante, verifica se a estrutura está vazia e faz a inserção do valor constante em uma das variáveis e posteriormente cria um nó. O problema é que só consigo imprirmir o valor da variável inteira dentro da função, enquanto que na função "main" aparece o erro de segmentação. Abaixo segue o código:

 

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

struct Lista *insere_final(struct Lista *n, int x); //prototipo da funcao

struct Lista{
    int valor;
    struct Lista *proximo; //ponteiro para a proxima entrada da lista
                           //uso de recursividade. Uma struct dentro de outra
};

int main(){
    struct Lista *inicio;
    insere_final(inicio, 10);

    printf("O valor fora da funcao de inicio->valor e: %d \n", inicio->valor);

    return 0;
}

struct Lista *insere_final(struct Lista *n, int x){
struct Lista *novo=(struct Lista *)malloc(sizeof(struct Lista)); //alocou memoria dinamicamente para a lista
novo->valor=x;
if(n==NULL){//lista nao esta vazia
    printf("n esta vazio! \n");
    novo->proximo=NULL;
    printf("1 - O valor dentro da funcao de novo->inicio: %d \n", novo->valor);
    return novo; //novo no sera o inicio da lista
}
else{//lista nao esta vazia-vamos ao final para inserir o no
    struct Lista *temp=n; //criando referencia ao primeiro no
    while(temp->proximo!=NULL){//e preciso ir ao ultimo no
        temp=temp->proximo;
    }
    novo->proximo=NULL;
    temp->proximo=novo;//o ultimo no apontara para o novo no
    printf("Entrou em else e esta verificando temp \n");
    return n;
}

}


Desde já agradeço a todos que possam me ajudar!

 

Link para o comentário
Compartilhar em outros sites

@paulopimenta6 O problema é que você está reservando memória e não está usando-a para nada, preste atenção que quando você retorna o ponteiro ele não está indo a lugar algum.

43 minutos atrás, paulopimenta6 disse:

insere_final(inicio, 10);

ele é passado pelo return da função, é quando o programa vai fazer o próximo printf ele ainda não está inicializado.

 

Exemplo de uma lista

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

struct no
{
    int valor;
    struct no *proximo;
};

int main(int argc, char *argv[])
{
    struct no *inicio_lista = NULL, *fim_lista = NULL, *aux;
    /* Cria o primeiro nó na lista */
    inicio_lista = malloc(sizeof(*inicio_lista));
    /* Checa se foi possível reservar memoria */
    if (inicio_lista == NULL) {
        perror("Erro nao foi possivel reservar memoria ");
        return(1);      /* Encerra o programa */
    }
    /* Coloca um valor na lista */
    inicio_lista->valor = 35;
    /* Inicia o final da lista */
    inicio_lista->proximo = NULL;
    fim_lista = inicio_lista;

    /* Cria o segundo nó na lista */
    fim_lista->proximo = malloc(sizeof(*fim_lista));
    /* Checa se foi possível reservar memoria */
    if (fim_lista->proximo == NULL) {
        perror("Erro nao foi possivel reservar memoria ");
        return(1);      /* Encerra o programa */
    }

    /* coloca o final na lista */
    fim_lista = fim_lista->proximo;
    fim_lista->proximo = NULL;
    /* Coloca um valor na lista */
    fim_lista->valor = 44;

    /* Mostra a lista */
    aux = inicio_lista;
    while (aux != NULL) {
        printf("\n%i", aux->valor);
        aux = aux->proximo;
    }

    /* Apaga a lista */
    aux = inicio_lista;
    while (aux != NULL) {
        struct no *tmp = aux->proximo;
        free(aux);
        aux = tmp;
    }

    /* Tira a referencia dos ponteiros */
    inicio_lista = fim_lista = aux = NULL;
    getchar();      /* pausa o programa */
    return(0);
}

 

Recomendo você aprender a usar o gdb caso esteja usando o compilador gcc.

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