尝试显示类型(int)
的元素时,我遇到了分段错误template <class T>
void Lista<T>::imprimir()
{
NodoL *ptr = new NodoL;
ptr->sig = pri->sig;
cout << *ptr->sig->elem; //THIS DISPLAYS CORRECTLY
cout << *ptr->sig->sig->elem; //SEGMENTATION FAULT
}
答案 0 :(得分:7)
你确定sig不是NULL吗?
template <class T>
void Lista<T>::imprimir()
{
NodoL *ptr = new NodoL;
ptr->sig = pri->sig;
cout << *ptr->sig->elem; //THIS DISPLAYS CORRECTLY
if(ptr->sig == NULL || ptr->sig->sig == NULL)
return;
cout << *ptr->sig->sig->elem; //SEGMENTATION FAULT
}
答案 1 :(得分:1)
看来你有一个链表,其中sig
指向列表的下一个元素。您的代码分配一个新节点,并使其指向pri
中现有节点的尾部。如果你的列表只有两个元素开头,那么当你试图打印第三个元素时,这个代码会自然崩溃,因为没有这样的东西。第一个元素是*ptr->elem
,第二个元素是*pri->sig->elem
。
答案 2 :(得分:0)
确保elem
是一个可以解除引用的指针,并且它不是指向内存中的某个无效位置,或者它不是NULL。您似乎有某种类型的链表,并且您正在尝试访问距离ptr
指向的当前节点两个节点的列表节点。该节点可能不存在,因此sig
是无效指针,或者节点成员elem
是无效指针。无论哪种方式,在尝试取消引用这么多步骤之前,一定要检查指针。事实上,这可能最好用for循环来完成,例如:
NodoL* temp = ptr;
for (int i=0; i < NUMBER; i++)
{
if (temp->sig == NULL)
break;
temp = temp->sig;
}
cout << *temp->elem << endl;
通过这种方式,您将从目前所在位置的列表中通过某个预先指定的NUMBER
预先指定的节点,或者您将提前终止for循环,因为您已达到清单。