2017-04-30 19 views
-4

私はC++クラスの二重リンクリストを作成していますが、挿入関数に問題があります。考えられるのは、ソートされたリストに正しい位置(つまり、数字の前、数字の前)に値を挿入することです。この関数は、正しい場所に数値を挿入するという点で機能しますが、ポインタを割り当てて新しいノードを考慮しようとすると、segフォルトが発生します。特定の行は次のとおりです。C++でsegフォルトを取得する二重リンクリスト挿入関数

nodePtr->previous = newNode; 

私は問題なく他のスポットでnodePtrからポインタを割り当てるために同じ構文を使用しますので、私はここに理由ワンセグ障害を理解することはできません。

ご協力いただきありがとうございます。

EDIT:nodePtrがnullptrに設定された後、前のポインタにアクセスしようとすると問題が発生したようです。 if文は手前でcaseに処理されます。 .cppファイルから

struct ListNode { 
    double value; 
    struct ListNode *next; 
    struct ListNode *previous; 
}; 

ListNode *head; 

:.Hから

void NumberList::insertNode(double num) 
{ 
ListNode *newNode; 
ListNode *nodePtr; 
ListNode *previousNode; 
newNode = new ListNode; 
newNode->value = num; 

if(!head) 
{ 
    head = newNode; 
    newNode->next = nullptr; 
} 
else 
{ 
    nodePtr = head; 
    previousNode = nullptr; 
    while (nodePtr != nullptr && nodePtr->value < num) 
    { 
     previousNode = nodePtr; 
     nodePtr = nodePtr->next; 
     if (nodePtr != nullptr) 
      nodePtr->previous = previousNode; 
    } 
    if (previousNode == nullptr) 
    { 
     head = newNode; 
     newNode->next = nodePtr; 
    } 
    else 
    { 
     nodePtr->previous = newNode;/*This is the line that seg faults.*/ 
     previousNode->next = newNode; 
     newNode->next = nodePtr; 
     newNode->previous = previousNode; 
    } 
} 
} 
+0

を試してみてください。 –

+0

私はnullptrの前にnodePtr->を初期化しようとしましたが、segフォールトはまだ発生していますので削除しました。 –

+2

他のポインタについての帽子? 'head'、' next'、 'previous'、' nodePtr'のどれか?これらはすべてnullptrに初期化する必要があります。デバッガでコードをステップ実行し、適切な値が与えられる前にどの物が使用されているかを確認します。 –

答えて

0

は、あなたがリストnodePtrの最後に挿入され、その後、ライン

nodePtr->previous = newNode; // seg fault 
nullになります

は、SEGフォルトになります。あなたはそのケースを扱わなければなりません。

チェックnodePtrが...

if(nodePtr) 
    nodePtr->previous = newNode; 
+1

これは私の問題を解決しました、ありがとうございます。 –

0

それにアクセスする前にnullかそうでない場合は、これらの操作を実行する前に、nullptrを指すようにあなたの頭のポインタを初期化する必要があります。それ以外の場合は、不正なメモリアドレスへのポインタを間接参照しようとしているため、セグメンテーション違反が発生します。彼らは、デフォルトではNULLで起動しません、また彼らは、デフォルトで使用可能なオブジェクトを指すん:あなたは頭を初期化すると

、どこにも私はあなたが任意のポインタの初期化を参照してください行わない ListNode *head = nullptr;

+0

'head'はすでに' newNode'に初期化されています!!それは問題ではない –

+0

'head'のように見えますが、静的な保存期間があります。プログラムが開始されるとゼロに初期化されます。 –

+0

'if(!head) { head = newNode; newNode-> next = nullptr; } 'ここではケースが処理されます –

関連する問題