SIGSEGV (Ошибка сегментации) C ++ Указатели

Хорошо, это мой код:

#include <iostream>
using namespace std;
class Nodo{
public:
Nodo *siguiente,*anterior;
string Nombre,Curso,Posicion;
int carnet;
Nodo(){
siguiente=anterior=NULL;
Nombre=Curso="";
carnet=0;
}
};
class ListaCircular{
public:
Nodo *PrimerNodo,*UltimoNodo;
ListaCircular(){
*PrimerNodo->siguiente=*UltimoNodo;
}
};

int main(){
ListaCircular *a=new ListaCircular();
cout<<a->PrimerNodo->siguiente<<endl;
return 0;
}

Когда я пытаюсь запустить его, он говорит «BUILD SUCCESSFUL», но «RUN FAILED», и когда я отлаживаю его, появляется сообщение SIGSEGV, строка, которая, похоже, содержит ошибку:

*PrimerNodo->siguiente=*UltimoNodo;

но если я снова запускаю программу без строк:

ListaCircular *a=new ListaCircular();
cout<<a->PrimerNodo->siguiente<<endl;

Затем программа успешно собирается и запускается.

Как я могу сделать это «cout» успешно?

1

Решение

В конструкторе этого класса:

class ListaCircular{
public:
Nodo *PrimerNodo,*UltimoNodo;
ListaCircular(){
*PrimerNodo->siguiente=*UltimoNodo;
}
};

вы пытаетесь разыменовать неинициализированный указатель PrimerNodo, который производит неопределенное поведение. В вашем случае это приводит к ошибка сегментации (что на самом деле хорошо, потому что в противном случае такого рода ошибки могут быть трудно найти).

Одним из возможных решений является создание этих объектов типа Nodo в теле конструктора:

ListaCircular(){
PrimerNodo = new Nodo();
UltimoNodo = new Nodo();
PrimerNodo->siguiente = UltimoNodo;
}

Также обратите внимание, что эта строка:

cout << a->PrimerNodo->siguiente << endl;

напечатает адрес памяти, a->PrimerNodo->siguiente указывает на.

3

Другие решения

Я все еще новичок в C ++, так что, возможно, я ошибаюсь, но не должно ли это быть Primernodo->siguiente=Ultimonodo? в ListaCircular учебный класс..

Кроме того, что именно вы пытаетесь напечатать? Вы пытаетесь напечатать объект или как? Вы можете добавить еще один ‘->’ после «Siguiente, как» cout<<<a->PrimerNodo->siguiente->toString<< endl; или похожие..

1

так должно быть:

PrimerNodo->siguiente=UltimoNodo

Но, UltimoNodo не инициализируется, поэтому разыменование может быть незаконным (UB).

0

Определите новую функцию связи Nodo: —

void Nodo::SetSiguiente(Nodo*sig){
siguiente=sig;
sig->anterior=this;
}

Исправить конструктор: —

ListaCircular(){
PrimerNodo = new Nodo;
UltimoNodo = new Nodo;

PrimerNodo->SetSiguiente(UltimoNodo);
UltimoNodo->SetSiguiente(PrimerNodo);
}
0
По вопросам рекламы [email protected]