【问题标题】:Segmentation fault in C++ ListC++ 列表中的分段错误
【发布时间】:2016-03-25 06:43:18
【问题描述】:

我想创建一个自己的 List 类,每个节点都有一个值(double)。将节点添加到列表后,我想获得列表的正确长度 (1),但它只是在我的 Node::getNext() 方法中显示“分段错误”。

这是我的代码:

#include <iostream>
#include <cassert>

using namespace std;

class List{
private:
    class Node{
    public:
        Node(double value){
            this->value = value;
            this->setNext(nullptr);
        }
        Node* getNext(){
            return next;
        }
        void setNext(Node* myNode){
            this->next = myNode;
        }

    private:
        double value;
        Node* next;
    };

    Node *head;

public:
    List(){
        head = nullptr;
    }

    int length(){
        int length = 0;
        if (head == nullptr)return length;
        else{
            Node *pointer = head;
            do {
                pointer = pointer->getNext();
                length++;
            } while (pointer->getNext() != nullptr);
        }
        return length;
    }

    void pushback(double value){
        if (head == nullptr)head = new Node(value);
        else{
           lastNode()->setNext(new Node(value));
        }
    }

    Node* lastNode(){
        Node* end = head;
        while(end->getNext() != nullptr){
            end = end->getNext();
        }
        return end;
    }
};

class TestList{
public:
    void run(){
        testListConstructor();
        testAddOneNodeToList();
        //testAddSecondNodeToList();
    }

private:
    void testListConstructor(){
        List myList;
        assert(0 == myList.length());
    }

    void testAddOneNodeToList(){
        List myList;
        myList.pushback(1.5);
        assert(1 == myList.length());
    }

    void testAddSecondNodeToList(){
        List myList;
        myList.pushback(1.5);
        cout << myList.lastNode();
        myList.pushback(2.5);
        assert(2 == myList.length());
    }
};

int main(void){
    TestList tl;
    tl.run();
    cout << "Main-Function abgearbeitet" << endl;

    return 0;
}

我在 getNext 方法中做错了什么?为什么会出现分段错误?

【问题讨论】:

    标签: c++ list segmentation-fault


    【解决方案1】:

    由于您被调用pointer = pointer-&gt;getNext(),您必须检查pointer 是否为nullptr 作为您的do-while 子句的条件。

    或者只是做类似的事情:

    len = 0;
    curr = head
    while (curr != nullptr) {
        ++len;
        curr = curr.next
    }
    

    【讨论】:

      【解决方案2】:

      你在这里使用了一个 nullptr

      Node *pointer = head;
      do{
          pointer = pointer->getNext(); \\ (1)
          length++;
      }while (pointer->getNext() != nullptr);
      

      因为当你到达最终列表节点时,(1) 之后的pointer 的值将是nullptr

      【讨论】:

      • 非常感谢。没看到那个错误。我将 do-while 循环更改为 while,现在我只需要检查指针是否为 nullptr。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 2012-06-12
      • 2020-09-10
      相关资源
      最近更新 更多