[RESOLVIDO] Erro de segmentation fault

5 respostas
Hiago_Alves

Tenho um problema com erro de memória no meu código que era pra ser bem simples
O erro está quando adiciono um novo nó a minha lista encadeada aqui está a struct

struct Disciplina{
	int codigo;
	ListaAluno alunos;

	Disciplina(){
		codigo=0;
	}
};
struct ListaDisciplina{
	Disciplina* disciplina;
	NoDisciplina *primeiro;
	NoDisciplina *ultimo;
	int tamanho;

	ListaDisciplina(){
		tamanho=0;
		primeiro=ultimo=NULL;
	}
};

E pra adicionar nela uso essa função

ListaDisciplina* adicionarDisciplina(ListaDisciplina* desc, int codigo){
		NoDisciplina* newDisc = new NoDisciplina();
		newDisc->disciplina->codigo = codigo;
		if(desc->tamanho==0){
			desc->tamanho++;
			desc->ultimo = newDisc;
			desc->primeiro = newDisc;
			return desc;
		}
		newDisc->ant = desc->ultimo;
		desc->ultimo->prox=newDisc;
		desc->ultimo = newDisc;
		desc->tamanho++;
		desc->disciplina->codigo++;
		return desc;
}

Por exemplo se adiciona o codigo “3” à disciplina e preciso imprimir eles, os valores que aparece é um valor aleatório da memória tipo “3xxxxxx”.

Alguém sabe o porquê de está mostrando um valor da memoria?

5 Respostas

rodevops

Não seria por essa linha…

newDisc->disciplina->codigo = codigo;

Não deveria ser…

newDisc->disciplina = new Disciplina();
newDisc->disciplina->codigo = codigo;
Hiago_Alves

É uma lista encadeada que tenho que fazer e nela tem 3 structs: Disciplina, NoDisciplina e ListaDisclina(descritor) e ai eu adiciono no NoDisciplina que é onde tem um ponteiro pro prox da lista

rodevops

Eu entendi, por isso mesmo perguntei da instância/ponteiro em NoDisciplina, dentro dessa struct você tem um ponteiro para disciplina, afinal você não postou pra gente ver…

typedef struct {
    Disciplina* disciplina;
    ...
} NoDisciplina;

Com isso lá no adiciona. se você tentar isso antes de criar um ponteiro…

newDisc->disciplina->codigo = codigo;

Pode dar falha de segmentação porque você está pulando o ponteiro acesando diretamente o código…

Hiago_Alves

Consegui resolver, obrigado.
ao invés de ser newDisc->disciplina->codigo tem que ser newDisc->disciplina.codigo
nao sei a diferença de -> e ‘.’ no uso de ponteiros, mas sua dica me ajudou a lembrar disso

rodevops

Esse post pode ajudar…

Criado 11 de agosto de 2017
Ultima resposta 12 de ago. de 2017
Respostas 5
Participantes 2