分段错误 11 链表节点结构


#include<iostream>
using namespace std;
class list
{
public:
    list();
    bool insertHead(int n);
private:
    struct node
    {
        int item;
        node *next;
    };
    node* head;
    };

list::list()
{
    head = NULL;
    head -> item = 0;
    head -> next = NULL;
}
bool list::insertHead(int n)
{
    node* tempptr = new node;
    tempptr->item = n;
    tempptr->next = head;
    head = tempptr;
    return true;
}
    int main()
    {
            list test1;
            test1.insertHead(4);
            return 0;
    }

这段代码编译得很好,但不幸的是,运行时会出现段错误。我尝试在插入头函数的末尾添加删除临时程序,但无济于事。我不擅长内存分配,我知道分段错误与运行时的内存分配有关。有人可以帮助我吗?我只是使用 insertHead 将一个整数插入链表的前面。有人可以帮助我吗?谢谢!我将实现和其他文件组合在一起,以便更容易阅读......我认为。谢谢

    head = NULL;
    head -> item = 0;
*** segmentation fault, beacuse head is null, can't dereference
    head -> next = NULL;

我建议使用GDB,用这个程序运行gdb。当它出现段错误时,它会给你一个堆栈跟踪,确切地记录程序 seg 出错的位置。然后,您可以使用"p 命令"打印相关变量。Seg 错误始终意味着访问进程范围之外的内存(具有不在进程内的值的指针 - 无效指针(。学习很好地使用GDB将为您节省大量时间,这是针对seg故障的insta修复:-(

创建空列表时,只需将head设置为 NULL。没有必要设置它的itemnext,因为它是一个空列表。您取消引用了 NULL 指针,这是不允许的,并且在大多数系统上会导致分段错误或类似错误。

list::list()
{
    head = NULL;
}

你真的对这段代码崩溃感到惊讶吗?

head = NULL;
head -> item = 0;
head -> next = NULL;

将 NULL 分配给指针并立即引用它。

head = NULL;
head -> item = 0;
head -> next = NULL;

不可能工作。->运算符取消引用指针,如果其值设置为 NULL,这显然是不可能的。您需要事先为头部分配内存:

head = new node;

相关内容

  • 没有找到相关文章

最新更新