#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。没有必要设置它的item
或next
,因为它是一个空列表。您取消引用了 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;