簡體   English   中英

指針分配時出現分段錯誤

[英]Segmentation fault while pointer assignment

編寫程序以反轉給定單鏈列表的方向。 換句話說,在反轉之后,所有指針現在都應該指向后。

我正在嘗試解決上述問題。 我編寫了用於單鏈表的插入,搜索和刪除以及打印的功能。

我的打印功能如下

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是未定義的行為,因為您不知道要更改的內存區域。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM