2011-09-07 2 views
2

Im получаю ошибку сегментации при попытке отобразить элемент типа (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

Используйте отладчик, Люк! –

ответ

7

Вы уверены, что сиг не 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 
} 
+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-loop раньше, потому что вы достигли конца списка.

Смежные вопросы