#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函数的末尾添加delete tempptr,但无济于事。我在内存分配上非常糟糕,我知道分段错误与运行时的内存分配有关。有谁能够帮我?我只是使用insertHead在链表的前面插入一个整数。有人可以帮帮我吗?谢谢!我将实现和其他文件结合在一起,因此更容易阅读......我想。感谢
答案 0 :(得分:2)
head = NULL;
head -> item = 0;
*** segmentation fault, beacuse head is null, can't dereference
head -> next = NULL;
答案 1 :(得分:2)
我建议使用GDB,用这个程序运行gdb。当它发生段错误时,它会给你一个堆栈跟踪,指出程序段出错的确切位置。然后,您可以使用'p命令'打印相关变量。 Seg fault总是意味着访问进程外部的内存(指针值不在你的进程中 - 指针无效)。学习如何使用GDB将为您节省大量时间,这是针对seg故障的一个insta-fix: - )
答案 2 :(得分:1)
创建空列表时,只需将head
设置为NULL即可。无需设置其item
或next
,因为它是一个空列表。您正在取消引用NULL指针,这是不允许的,并且在大多数系统上都会导致分段错误或类似错误。
list::list()
{
head = NULL;
}
答案 3 :(得分:0)
你真的对这段代码崩溃感到惊讶吗?
head = NULL;
head -> item = 0;
head -> next = NULL;
您为指针指定NULL并立即引用它。
答案 4 :(得分:0)
head = NULL;
head -> item = 0;
head -> next = NULL;
不可能奏效。 ->
运算符取消引用指针,如果其值设置为NULL
,则显然不可能。您需要事先为头部分配内存:
head = new node;