1

同等だと思うコードセットは2つありますが、1つはセグメンテーション違反を引き起こし、もう1つは引き起こしません。なぜこれが当てはまるのか、私は本当に混乱しています...

私が欲しいのは、次のような検索関数を作成することです

このコードは機能します:

    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関数を移動して、MyPairの2番目の要素となるBinomialNode*を返すようにすることでした。このバージョンのaddDupeは、MyPair*ではなくBinomialNode*を処理します。

セグメンテーション違反を追跡して、ペア->秒を返しました。
なぜそれがセグメンテーション違反を引き起こすのに、上からの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);
    }
}
4

2 に答える 2

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

NULLその後、ポインタにアクセスしようとすると、原因は何ですかSEGFAULT

あなたはチェックする必要がありますNULL

if(pair==NULL) //when pair is 0
             return NULL;
于 2012-11-19T10:18:46.080 に答える
1

if(pair!=NULL) return NULL;

する必要がありますif(pair==NULL) return NULL;

于 2012-11-19T10:20:46.780 に答える