2013-03-10 4 views
1

Ok это мой код: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 УСПЕШНО», но «RUN FAILED», и когда я его отладки появляется сообщение SIGSEGV , линия, которая, кажется, есть ошибка есть:

*PrimerNodo->siguiente=*UltimoNodo; 

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

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

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

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

+0

У вас нет Nodos, только указатели на Nodos. – QuentinUK

+0

Что именно вы хотите распечатать? –

+0

Actualy cout не важен, это как способ убедиться, что PrimerNodo-> siguiente указывает на UltimoNodo, реальный факт заключается в том, что я должен указать PrimerNodo-> siguiente на UltimoNodo –

ответ

3

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

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 указывает на.

+0

Спасибо большое =) –

0

должно быть:

PrimerNodo->siguiente=UltimoNodo

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

+0

Y Пробовал этот путь раньше, но все еще имею такая же проблема –

+0

@RobertoHernandez, потому что 'UltimoNodo' не инициализируется.Пожалуйста, инициализируйте его следующим образом: 'UltimoNodo = new Nodo()' –

+0

Да, вы правы, спасибо =) –

1

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

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

+0

, пожалуйста, не занимите этот ответ. У плаката не хватает привилегий для публикации в качестве комментария! –

+0

+1 за попытку помочь :-) –

0

Define новой функции, связывающей 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

если я изменю 'UltimoNodo' или' PrimerNodo' .. другой тоже изменится. Плохой способ сделать это! :-) –

+0

Если он будет круговым в обоих направлениях, вам придется написать функцию для изменения узла, который перемещает все указатели. – QuentinUK

Смежные вопросы