指针分配时出现分段错误

Segmentation fault while pointer assignment

本文关键字:分段 错误 分配 指针      更新时间:2023-10-16

编写一个程序来反转给定单链表的方向。换句话说,在反转之后,所有指针现在都应该指向后面。

我正在努力解决上述问题。我为单链表编写了插入、搜索、删除和打印功能。

我的打印功能如下

void print(list **l)
{
    list *p=*l;
    for(int i=0;p;i++)
    {
        cout<<p->item<<endl;
        p=p->next;
    }
}

它可以很好地打印列表中的所有值。

但在主功能中,如果我做同样的任务,比如这个

list *p=*l;

它给我的分割错误。我的主要功能如下

main()
{
    list **l;
    *l=NULL;
    int n;
    while(cin>>n)
    insert(l,n);
    list *p=*l;
    list *prev=NULL;
    list *next;
    while(p)
    {
        next=p->next;
        p->next=prev;
        prev=p;
        if(next==NULL)
        *l=p;
        p=next;
    }       
    print(l);
}

我的插入函数如下

void insert(list **l,int x)
{
    list *p;
    p=(list *)malloc(sizeof(list));
    p->item=x;
    p->next=*l;
    *l=p;
}

我在打印功能中所做的分配和主功能之间有什么区别?为什么我在打印函数中没有任何错误,而在主函数中出现了分段错误?

如果我的功能像这个

main()
{
    list **l;
    *l=NULL;
    int n;
    while(cin>>n)
    insert(l,n);
    print(l);
}

我没有收到任何错误,我可以插入和打印列表的值。

当您编写时

list **l;
*l=NULL;

您正在取消引用一个无效的指针,因此会遇到未定义的行为。

在函数内部,您可能正在传递一个有效的指针作为参数。例如

list* l;
void print(&l)

在这种情况下,&l的类型是list**-,它指向一个悬空的list*,因此取消引用它将产生一个指针(l本身)。l未初始化,但无法从中读取是可以的。

您编写:

list **l;
*l=NULL;

但是l没有赋值,你不知道它的值,所以*l=NULL是未定义的行为,因为你不知道你在改变内存的哪个区域。