1

そのため、newPtr のデータを origPtr のデータと等しく設定しようとすると、for-control-structure の最初の lopp 内で seg fault を受け取ります。何が原因なのかわかりません。これはおそらく私のポインターの誤用ですか?それともタイプミス?それとも、私の for ループのイディオムの範囲エラーですか?

List::List(const List &aList): numNodes(aList.numNodes) {
    empty = true;
    forward = true;
    string flag;

    cout << "Copy from head to tail? (y/n): ";
    cin >> flag;
    if(flag=="n")
        forward = false;

    if(!aList.head) {
        head = NULL; //aList is empty. so is this->List.
        tail = NULL;
    } else { // copy 1st Node.
        head = new Node;
        if(forward)
            head->setData(aList.head->getData());
        else // copy in reverse.
            head->setData(aList.tail->getData());
        //copy rest of List.
        Node *newPtr = head; //newPtr points to last Node in new List.

        //origPtr points to nodes in original List.
        if(forward) {
            cout << "Copying normally...\n" << endl;
            for(Node *origPtr=aList.head->getNext(); origPtr!=NULL;
                origPtr=origPtr->getNext()) {
                newPtr = newPtr->getNext();
                newPtr->setData(origPtr->getData()); //SEG FAULT
            } // end for
            cout << "3" << endl;
        } else {
            cout << "Copying in reverse order...\n" << endl;
            for(Node *origPtr=aList.tail->getPrev(); origPtr!=NULL;
                origPtr=origPtr->getPrev()) {
                newPtr = newPtr->getNext();
                newPtr->setData(origPtr->getData()); //SEG FAULT
            } // end for
        } // end if/else
        newPtr->setNext(NULL);
    } // end if/else
    cout << "Done copying!\n" << endl;
} // end copy constructor

さらにコードが必要な場合は、必要な編集を行います。

また、c++11 の標準は nullptr を使用することであることも承知しています。この実装には使用しません。gcc-v4.6.3 を使用して Ubuntu 12.04 を実行していますが、これは c++11 をサポートしていません。

編集:みんなありがとう!そこで、newPtr が getNext() を指す前に、for ループに 3 行追加しました。newPtr を head を指すように定義した後、次の行で newNode を NULL を指す Node ポインターとして宣言しました。

            newNode = new Node;
            newNode->setPrev(newPtr);
            newPtr->setNext(newNode);
4

3 に答える 3

2

これをして

head = new Node;
//...
Node *newPtr = head; //newPtr points to last Node in new List.

それから

newPtr = newPtr->getNext();
newPtr->setData(origPtr->getData()); //SEG FAULT

Nodeただし、見えないコードで魔法が行われている場合を除き、ノードに次のポインターを設定しないでください。getNext がNULL Nodeセグ フォールトの原因となる a を返すと思われます。最初にデータを設定し、次に次のノードをポイントしてからそこに移動する方が理にかなっています。

于 2013-08-16T09:21:13.073 に答える
0
   for(Node *origPtr=aList.head->getNext(); origPtr!=NULL;
                origPtr=origPtr->getNext()) {
     newPtr = newPtr->getNext();
     newPtr->setData(origPtr->getData()); //SEG FAULT
   } // end for

私が見ている問題は、作成している新しいリストに新しいメモリを割り当てていないことです。ヘッド ノード用の新しいメモリのみを作成しました。

何かのようなもの:

for(Node *origPtr=aList.head->getNext(); origPtr!=NULL;
                origPtr=origPtr->getNext()) {
     Node *temp = new Node;
     newPtr->next = temp; // assuming you have next as a member of the class Node.
     newPtr = newPtr->getNext();
     newPtr->setData(origPtr->getData());
   } // end for
于 2013-08-16T09:29:48.760 に答える