SegFault有一个版本的等效代码?

时间:2012-11-19 10:17:11

标签: c++ segmentation-fault equivalent

我认为有两组代码是等价的,但是一组导致seg错误而另一组没有。我真的很困惑为什么会这样......

我想要的是创建一个

的查找功能

此代码确实有效:

    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);
    }
}

以下代码不起作用。从上面的变化是我试图尝试将find函数移出并使其返回BinomialNode *,这将是MyPair中的第二个元素。此版本中的addDupe处理BinomialNode *而不是MyPair *。

我跟踪了段错误以返回对 - >第二 为什么会导致段错误,但是上面的对 - &gt; second-&gt; 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);
    }
}

2 个答案:

答案 0 :(得分:2)

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

所以在那之后你试图访问NULL指针导致SEGFAULT

的原因

您必须检查NULL

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

答案 1 :(得分:1)

if(pair!=NULL) return NULL;

应为if(pair==NULL) return NULL;