簡體   English   中英

SIGSEGV(分段錯誤)C ++指針

[英]SIGSEGV (Segmentation fault) C++ Pointers

好的,這是我的代碼:

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

在這個類的構造函數中:

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

我仍然是c ++的新手,所以可能是我錯了,但不應該是Primernodo->siguiente=Ultimonodo ListaCircular類中..

另外,你到底想要打印什么? 你想打印物體,還是什么? 你可能想在“Siguiente之后添加另一個' - >',比如” cout<<<a->PrimerNodo->siguiente->toString<< endl; 或類似..

它應該是:

PrimerNodo->siguiente=UltimoNodo

但是, UltimoNodo未初始化,因此取消引用它可能是非法的(UB)。

定義一個新的Nodo鏈接功能: -

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

修復構造函數: -

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

    PrimerNodo->SetSiguiente(UltimoNodo);
    UltimoNodo->SetSiguiente(PrimerNodo);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM