Ir ao conteúdo

Posts recomendados

Postado

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!

 

Postado

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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!