分段错误,你能帮帮我吗?

时间:2011-09-07 17:12:50

标签: c++ pointers segmentation-fault

尝试显示类型(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
}

3 个答案:

答案 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循环,因为您已达到清单。