分段故障11链接列表节点结构

时间:2013-07-18 06:59:33

标签: c++ linked-list

#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在链表的前面插入一个整数。有人可以帮帮我吗?谢谢!我将实现和其他文件结合在一起,因此更容易阅读......我想。感谢

5 个答案:

答案 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即可。无需设置其itemnext,因为它是一个空列表。您正在取消引用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;