2011-09-07 104 views
2

即时得到试图显示类型的元素时分段故障(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

请发布相关代码。什么是'sig'?答案是“你做错了”,但不可能说出来,因为你没有显示错误代码。 –

+0

我猜'sig'是“siguiente”(或somesuch)的一些缩写,西班牙语是“next”,这是一个链表的代码。但请澄清。 –

+0

使用调试器,Luke! – 2011-09-07 17:19:33

回答

7

确定的签名是不是空?

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 
} 
+0

与你简单的检查它返回....这意味着我做错了什么时候挂钩在此之前的节点... 感谢您的快速响应 – HoNgOuRu

+0

好吧,我发现错误 时,将第二个节点添加到列表I曾经有: ult-> sig = nuevoNodo; 但我将其更改为 ult-> sig-> sig = nuevoNodo; ult-> sig = nuevoNodo; 现在它按预期工作。 – HoNgOuRu

+0

不错。如果您使用的是Linux,则可以启用核心转储。所以你可以使用gdb来找出你的程序崩溃的地方 –

1

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

+0

谢谢,你是对的。添加新节点时列表未正确连接。 – HoNgOuRu

0

确保elem是一个可以被解除引用的指针,它不是指向内存中某个无效位置,也不是NULL。看起来您有某种类型的链接列表,并且您试图访问与ptr指向的当前节点相距两个节点的列表节点。该节点可能不存在,因此sig是无效指针,或节点成员elem是无效指针。无论如何,在尝试解除引用这么多步骤之前,您一定要检查指针。事实上,这可以最好地像一个做了循环如:

NodoL* temp = ptr; 

for (int i=0; i < NUMBER; i++) 
{ 
    if (temp->sig == NULL) 
     break; 

    temp = temp->sig; 
} 

cout << *temp->elem << endl; 

这样,你要么在列表中通过预先指定的节点中的某个NUMBER从那里你目前,或者您将尽早终止for循环,因为您已到达列表的末尾。