[英]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.