2013-03-10 51 views
1

確定這是我的代碼: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」,而是「運行失敗」,而當我調試它出現在SIGSEGV消息,似乎有一個錯誤的行是:

*PrimerNodo->siguiente=*UltimoNodo; 

,但如果我再次運行程序,而不線:

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

那麼程序就有了成功的構建和運行。

我怎樣才能讓「cout」成功?

+0

你沒有任何Nodos,只有指向Nodos的指針。 – QuentinUK 2013-03-10 18:36:20

+0

你想要打印什麼? – 2013-03-10 18:39:13

+0

實際上,cout並不重要,就像確保PrimerNodo-> siguiente指向UltimoNodo的一種方式,真正的事實是我必須將PrimerNodo-> siguiente指向UltimoNodo – 2013-03-10 18:44:10

回答

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

非常感謝=) – 2013-03-10 18:50:21

0

它應該是:

PrimerNodo->siguiente=UltimoNodo

但是,UltimoNodo沒有初始化,所以提領它可能是非法的(UB)。

+0

以前嘗試過這種方式,但仍然有同樣的問題 – 2013-03-10 18:39:12

+0

@RobertoHernandez,因爲'UltimoNodo'沒有初始化。請初始化它:'UltimoNodo = new Nodo()' – 2013-03-10 18:42:16

+0

是的,謝謝=) – 2013-03-10 18:46:14

1

我還是有點新的C++,所以它可能是我錯了,但不應該是Primernodo->siguiente=Ultimonodo?在ListaCircular類。

此外,你究竟想要打印什麼?你想打印對象,還是什麼?您可能要添加其他 ' - >' 後 「Siguiente,像」 cout<<<a->PrimerNodo->siguiente->toString<< endl;或類似..

+0

請不要downvote這個答案。海報沒有足夠的權限發表評論! – 2013-03-10 18:41:00

+0

+1試圖幫助:-) – 2013-03-10 18:45:07

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

如果我更改了'UltimoNodo'或'PrimerNodo' ..另一個也會改變。糟糕的做法! :-) – 2013-03-10 18:48:46

+0

如果它在兩個方向都是圓形的,那麼你必須編寫一個函數來改變一個節點,這個節點會移動所有的指針。 – QuentinUK 2013-03-10 18:51:33