2011-09-07 107 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循環,因爲您已到達列表的末尾。