Ошибка сегментации, вы можете мне помочь? - PullRequest
2 голосов
/ 07 сентября 2011

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

7 голосов
/ 07 сентября 2011

Вы уверены, что 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 голос
/ 07 сентября 2011

Похоже, у вас есть связанный список, где sig указывает на следующий элемент списка. Ваш код выделяет новый узел и делает его указателем на хвост существующего узла в pri. Если в вашем списке было только два элемента, то этот код естественно вылетает при попытке напечатать третий элемент, потому что такого нет. Первый элемент - *ptr->elem, а второй - *pri->sig->elem.

0 голосов
/ 07 сентября 2011

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

...