分割故障,你能帮我一下吗?

Segmentation fault, can you help me?

本文关键字:一下 故障 分割      更新时间:2023-10-16

当试图显示类型为(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
}

您确定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
}

看起来您有一个链表,其中sig指向列表的下一个元素。您的代码分配了一个新节点,并使其指向pri中现有节点的尾部。如果列表开始时只有两个元素长,那么当您试图打印第三个元素时,这段代码自然会崩溃,因为没有这样的东西。第一个元素是*ptr->elem,第二个元素是*pri->sig->elem

确保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循环,因为您已经到达列表的末尾。