2013-02-19 99 views
0

編寫一個程序來顛倒給定單鏈表的方向。換句話說,在逆轉之後,現在所有的指針都應該向後指向。指針賦值時的分段錯誤

我想解決上述問題。我編寫了用於插入,搜索和刪除以及打印單個鏈接列表的函數。

我的打印功能如下

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

'list ** l;'是一個懸掛指針,所以'* l = NULL;'是未定義的行爲。 – enobayram 2013-02-19 11:56:50

+0

@enobayram我插入值的權利? – user2086900 2013-02-19 11:58:01

+0

是的,你正確地在'insert'函數中執行了一個插入,但是即使對於C,你的整體方法也是不適當的,更不用說C++了。是否有任何理由不使用'std :: list '?即使你想像C那樣編碼,使用'list * l = NULL;'並且以'print(&l)'的形式傳遞它。 – enobayram 2013-02-19 12:13:21

回答

3

當你寫

list **l; 
*l=NULL; 

你訪問一個空指針,所以碰到不確定的行爲。

函數內部可能傳遞了一個有效的指針作爲參數。例如

list* l; 
void print(&l) 

在這種情況下,&llist**類型的 - 它指向一個懸空list*,所以解除引用它會產生一個指針(l本身)。 l未初始化,但未從中讀取是可以的。

+0

list * p = * 1;如果我刪除這一行,我沒有收到任何錯誤 – user2086900 2013-02-19 12:01:31

+0

我更新了我的帖子,在第二種情況下我沒有收到任何錯誤。 – user2086900 2013-02-19 12:08:21

+0

@ user2086900這是未定義的行爲。我指出的路線是無效的。 – 2013-02-19 12:11:12

1

你寫:

list **l; 
*l=NULL; 

但是L是未分配,你不知道它的價值,所以* L = NULL是不確定的行爲,因爲你不知道的內存區域,您」重新改變。