1

好的,这是我的代码:

#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”成功?

4

4 回答 4

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指向的内存地址。

于 2013-03-10T18:36:59.943 回答
1

我对c ++还是有点陌生​​,所以可能是我错了,但不应该Primernodo->siguiente=Ultimonodo吗?在ListaCircular课堂上。。

另外,您到底想打印什么?您是要打印对象还是什么?您可能想在“Siguiente,like”cout<<<a->PrimerNodo->siguiente->toString<< endl;或类似内容之后添加另一个 '->'。

于 2013-03-10T18:40:08.523 回答
0

它应该是:

PrimerNodo->siguiente=UltimoNodo

但是,UltimoNodo没有初始化,所以取消引用它可能是非法的(UB)。

于 2013-03-10T18:33:51.110 回答
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);
}
于 2013-03-10T18:45:44.930 回答