2011-09-07 3 views
2

イムセグメンテーションフォルト、お手伝いできますか?タイプの要素(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

デバッガを使用する、Luke! –

答えて

7

あなたは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 
} 
+0

あなたの簡単なチェックでそれは返されました....それは、前にこのノードをフックするときに何か間違っていることを意味します... – HoNgOuRu

+0

ありがとう、よくわかりました、エラーが見つかりました リストI以前は持っていた: ult-> sig = nuevoNodo; しかし、私はそれを に変更しました.-> sig-> sig = nuevoNodo; ult-> sig = nuevoNodo; これは期待どおりに動作します。 – HoNgOuRu

+0

nice。 linuxを使用している場合は、コアダンプを有効にすることができます。 gdbを使ってプログラムがどこでクラッシュしたのかを知ることができます –

1

あなたが、リストの次の要素へsigポイントリンクリストを、持って表示されます。あなたのコードは新しいノードを割り当て、既存のノードの末尾を指すようにします(pri)。あなたのリストが2つの要素から始まっていない場合、このコードは、そのようなことがないので、3番目の要素を印刷しようとすると自然にクラッシュします。最初の要素は*ptr->elemで、2番目の要素は*pri->sig->elemです。

+0

ありがとうございます。新しいノードを追加するときにリストが正しく接続されていません。 – HoNgOuRu

0

elemが参照解除できるポインタであり、メモリ内の無効な場所を指していないか、NULLでないことを確認してください。いくつかの種類のリンクリストがあり、現在のノードから2つのノードであるリストノードにアクセスしようとしています(ptr)。そのノードが存在しない可能性があり、したがってsigが無効なポインタであるか、またはノードのメンバelemが無効なポインタです。いずれにしても、非常に多くのステップを逆参照しようとする前に、必ずポインタをチェックしてください。 、あなたは現在の位置しているところから、リスト内のあらかじめ指定されたノードの特定のNUMBERを通過するいずれかの方法

NodoL* temp = ptr; 

for (int i=0; i < NUMBER; i++) 
{ 
    if (temp->sig == NULL) 
     break; 

    temp = temp->sig; 
} 

cout << *temp->elem << endl; 

:実際には、これが最善のようなforループのようなものを行うことができますリストの最後に達したためにfor-loopを早期に終了します。

関連する問題