SegFault с одной версией эквивалентного кода?

Есть два набора кода, которые я считаю эквивалентными, но один вызывает ошибку сегмента, а другой — нет. Я действительно не понимаю, почему это так …

Я хотел бы создать функцию поиска, которая

Этот код работает:

    MyPair <Comparable, BinomialNode<Comparable>*> dummy(x, NULL);
MyPair <Comparable, BinomialNode<Comparable>*>* pair = hashTable.find(dummy);
if(pair!=NULL)
{
addDupe(x, pair);
}

void addDupe( Word & x, MyPair<Word, BinomialNode<Word>*>* pair)
{
list<int>::iterator it;
list<int> lines = x.getLineNums();
for ( it=lines.begin(); it != lines.end(); it++ )
{
pair->second->element.addLineNum(*it);
}
}

Код ниже НЕ работает. Изменения по сравнению с вышесказанным заключались в том, что я попытался переместить функцию поиска и заставить ее возвращать BinomialNode *, который будет вторым элементом в MyPair. addDupe в этой версии обрабатывает BinomialNode * вместо MyPair *.

Я отслеживал segfault, чтобы вернуть pair-> second.
Почему это вызывает segfault, а pair-> second-> element.addLineNum (* it) сверху нет?

BinomialNode<Comparable>* node = find(x);
if(node!=NULL)
{
addDupe(x, node);
}

BinomialNode<Comparable>* find(Comparable& x)
{
MyPair <Comparable, BinomialNode<Comparable>*> dummy(x, NULL);
MyPair <Comparable, BinomialNode<Comparable>*>* pair = hashTable.find(dummy);
if(pair!=NULL)
return NULL;
return pair->second; //LINE CAUSES SEGFAULT
}

void addDupe( Word & x, BinomialNode<Word>* node)
{
list<int>::iterator it;
list<int> lines = x.getLineNums();
for ( it=lines.begin(); it != lines.end(); it++ )
{
node->element.addLineNum(*it);
}
}

1

Решение

if(pair!=NULL) //when pair is not 0
return NULL;

так что после этого вы пытаетесь получить доступ к NULL указатель, что является причиной SEGFAULT

Вы должны проверить NULL:

if(pair==NULL) //when pair is 0
return NULL;
2

Другие решения

if(pair!=NULL)
return NULL;

должно быть if(pair==NULL)
return NULL;

1

По вопросам рекламы [email protected]