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

4

5 回答 5

2
    head = NULL;
    head -> item = 0;
*** segmentation fault, beacuse head is null, can't dereference
    head -> next = NULL;
于 2013-07-18T07:02:06.250 回答
2

我建议使用 GDB,用这个程序运行 gdb。当它出现段错误时,它会为您提供程序段错误的确切位置的堆栈跟踪。然后,您可以使用“p 命令”打印相关变量。段错误总是意味着访问您的进程范围之外的内存(具有不在您的进程内的值的指针 - 无效的指针)。学习使用 GDB 可以为您节省大量时间,它是针对 seg 错误的即时修复 :-)

于 2013-07-18T07:03:28.603 回答
1

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

list::list()
{
    head = NULL;
}
于 2013-07-18T07:05:52.733 回答
0

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

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

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

于 2013-07-18T07:02:26.180 回答
0
head = NULL;
head -> item = 0;
head -> next = NULL;

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

head = new node;
于 2013-07-18T07:02:32.610 回答