Ir ao conteúdo

Segmentation Fault com tratamento de char :|


andrebf

Posts recomendados

Postado

Daí galera.

Eu tava tentando implementar uma árvore em C e fiz uma estrutura com dois ponteiros e um nome. O nome eu deixei sendo um char, mas dá um erro na hora de execução de Segmentation Fault.

O código:


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

typedef struct no {
char nome;
struct no* esquerda;
struct no* direita;
} No;

void inserer(No**, char);
No* buscaNo(No*, char);

main()
{
No* arvore;
char name;

arvore = NULL;

printf("Digite o nome do novo no: ");
scanf("%c", &name);
insere(&arvore, name);

}

void insere(No *(*arvore), char name)
{
No aux;
char no_desejado;
if (*arvore == NULL)
{
(*arvore)->nome = name;
(*arvore)->esquerda = NULL;
(*arvore)->direita = NULL;
}
else
{
printf("Digite em qual no deseja por esse novo no: ");
scanf("%c", &no_desejado);
aux.nome = name;
aux.esquerda = NULL;
aux.direita = NULL;
}
}

Esse não é o código completo. Ainda falta eu chamar uma função pra procurar o nó que ele entrou.

Alguém sabe por que dá segmentation fault? Ele nem chama a função. Na hora de ler a tecla que ele digita (o char), ele já dá esse erro.

Eu coloquei o código porque existem uns warnings que eu gostaria de tirar também.


arvore.c:27: warning: conflicting types for ‘insere’
arvore.c:22: warning: previous implicit declaration of ‘insere’ was here
arvore.c: In function ‘buscaNo’:
arvore.c:54: warning: function returns address of local variable

Alguém dá uma ajuda aí?

Abraço!

Edit1: colocando char ou int ele dá na mesma.

  • Membro VIP
Postado


if (*arvore == NULL)
{
(*arvore)->nome = name;
(*arvore)->esquerda = NULL;
(*arvore)->direita = NULL;
}

Isso ai com certeza ta errado, se *arvore é NULL (*arvore)-> quaquer coisa vai dar erro, você precisa antes deixar ele apontando para algum lugar, algo assim resolveria:


if (*arvore == NULL)
{
*arvore = malloc(sizeof(No));
(*arvore)->nome = name;
(*arvore)->esquerda = NULL;
(*arvore)->direita = NULL;
}

Sobre os warning, tem parenteses sobrando na função:


void insere(No *(*arvore), char name)

E o ultimo esta em uma parte do código que você não postou.

Postado

EduardoS,

Eu coloquei o malloc e parece que agora não deu segmentation fault. Muito obrigado cara :)

Só uma coisa... não entendi quando você falou dos parênteses.

Ficaria assim?


void insere(No **arvore, No char)

?

Abraço e muito obrigado.

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