指针分配时的分段错误

时间:2013-02-19 11:54:30

标签: c++ c

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

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

我的打印功能如下

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);
}

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

2 个答案:

答案 0 :(得分:3)

写作时

list **l;
*l=NULL;

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

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

list* l;
void print(&l)

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

答案 1 :(得分:1)

你写道:

list **l;
*l=NULL;

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