当前位置: 首页 > 知识库问答 >
问题:

C++分段故障链表元素添加

柴坚诚
2023-03-14

我在用C++编写链表实现时遇到了一个问题。每当我试图添加一个元素,我得到分段错误错误。

 #include <iostream>


    class node{
    public:
        int data;
        class node *next;
    };
    class LinkedList {
    public:
        node *head;
        LinkedList(int num);

        void add(int number);
        void display();
    };

    const int null = 0;
    LinkedList::LinkedList(int num) {
        // TODO Auto-generated constructor stub
        std::cout<<"Constructor Called"<<std::endl;
        head->data = num;
        head->next = null;
        std::cout<<"Constructor Call completed"<<std::endl;
    }



    void LinkedList::add(int num) {
        struct node *n=new node;
        n->data = num;
        n->next = null;
        struct node *current = head;
        while (current->next != null) {
            current = current->next;
        }
        current->next = n;
    }
    void LinkedList::display() {
        std::cout<<"Display"<<std::endl;
        struct node *current = head;

        while (current!= null) {
            std::cout << current->data << "->";
            current = current->next;
        }
        std::cout << "null"<<std::endl;
    }

    int main() {
        LinkedList l(1);
        l.display();
        l.add(2);
        l.display();
        return 0;
    }

提前感谢!

struct node *n=new node;
Constructor Called
Constructor Call completed

Breakpoint 1, main () at SampleCPP.cpp:60
60      l.display();
(gdb) s
LinkedList::display (this=0xbffff03c) at SampleCPP.cpp:48
48      std::cout
(gdb) n
51      while (current!= null) {
(gdb) n
52          std::cout data ";
(gdb) n
53          current = current->next;
(gdb) n
51      while (current!= null) {
(gdb) n
55      std::cout null
56  }
(gdb) n
main () at SampleCPP.cpp:61
61      l.add(2);
(gdb) s
LinkedList::add (this=0xbffff03c, num=2) at SampleCPP.cpp:38
38      struct node *n=new node;
(gdb) print n
$2 = (node *) 0x0
(gdb) 

共有1个答案

严项明
2023-03-14

您从不为head分配内存。那是你的问题.

在构造函数中分配它:

LinkedList::LinkedList(int num) {
    std::cout<<"Constructor Called"<<std::endl;
    head = new node; // This is missing!
    head->data = num;
    head->next = null;
    std::cout<<"Constructor Call completed"<<std::endl;
}

程序完成之前释放所有的内存也是很好的…

 类似资料:
  • 编辑:底部的工作代码 我对编程相对较新,我正在试图理解为什么这不起作用。我决定通过一个函数而不是来处理卡片,以保持它尽可能模块化。这是我下面的代码;我知道错误与指针有关,但我不明白我做错了什么。 工作代码:

  • 正在尝试读取输入。txt文件,并使用fscanf将行内容存储到int变量、数组和2D数组中,以便以后使用该值进行计算。我认为这里的问题是因为我没有使用fscanf处理“EOF”? 这是我的密码: 这是你的电话号码。txt输入文件: 这里是输出:

  • 问题内容: 我有一个用于捕获任何分段错误或ctrl- c的应用程序。使用下面的代码,我能够捕获分段错误,但是该处理程序一次又一次地被调用。我该如何阻止他们。供您参考,我不想退出我的申请。我只是可以小心释放所有损坏的缓冲区。 可能吗? 处理程序就是这样。 在这里,对于Segmentation故障信号,处理程序被多次调用,并且很明显MyfreeBuffers()给我释放已释放的内存的错误。我只想释放一

  • 我有一个便宜的5美元/月的服务器,1G内存为我的网站处理一些图像。在将GIF图像写入磁盘时,我很少会遇到PHP Imagick的分割错误。 我在console命令上设置了一个内存限制,希望PHP能够首先捕获这个问题,并抛出一个我可以正确处理的异常,但这不起作用。 特别的问题是某些GIF图像会导致它在这行代码中崩溃: 特定的GIF是与成人相关的GIF,因此我不确定是否可以共享它。 以下是我的服务器日

  • 我有一个应用程序,我用它来捕捉任何分割错误或ctrl-c。使用下面的代码,我能够捕获分段错误,但是处理程序被一次又一次地调用。我怎样才能阻止他们。告诉你,我不想退出我的申请。我只是可以小心释放所有损坏的缓冲区。 可能吗? handler是这样的。 这里的分段故障信号,处理程序被多次调用,因为明显的MyFreeBuffers()给我释放已经释放的内存的错误。我只想免费一次,但仍然不想退出应用程序。

  • 分段错误发生在 运行Glewinfo 运行VisualInfo 测试程序(详细信息如下) 调用glGetProgramInterfaceiv(详细信息如下) 使用gdb实现glewinfo的堆栈跟踪 使用gdb实现visualinfo的堆栈跟踪 下面是使用已安装的GLEW库和glfw3(3.0.3)的测试程序 编译: 运行前。/basic I设置 (否则我会得到分段错误,因为它试图使用安装的GLE