2011-05-23 192 views
-2

我在運行此代碼時遇到分段錯誤錯誤。我在gdb中運行時沒有收到錯誤。我也沒有得到這個錯誤當我< 17.鏈接列表C錯誤

void test() 
{ 
    struct node *listHead=NULL; 
    int i=0; 
    while(i<17) 
     addTail(&listHead,createNode(i++)); 
} 

struct node* createNode(int i) 
{ 
    struct node *n = malloc(sizeof(*n)); 
    n->item = i; 
    return n; 
} 
void addTail(struct node **listHead, struct node *n) 
{ 
    if(*listHead!= NULL) 
    { 
     struct node *temp = *listHead; 

     while(temp->next != NULL) 
     { 
      temp = temp->next; 
     } 
     temp->next = n; 
    } else 
    { 
     *listHead= n; 
    } 
} 
+0

-1:這很難說,因爲你沒有給insertTail'的'定義。 – 2011-05-23 20:51:46

+6

誰來回答這些問題? – 2011-05-23 20:54:18

+0

這個問題有什麼問題?它絕對幫助了我。這是我第一次使用C,我被這個錯誤困住了。我沒有努力去找出答案,而是能夠在1分鐘內到達並獲得答案。 – Hna 2011-05-23 21:06:42

回答

6

你沒有正確初始化新元素。

n->next = NULL;添加到createNode函數。

+0

感謝它的工作。爲什麼你必須將它初始化爲NULL?什麼是默認 – Hna 2011-05-23 20:54:35

+0

該標準沒有說任何變量都有默認的初始化。如果它沒有被初始化,那麼數據就是那裏最後一個對象留在內存中的東西。 – 2011-05-23 20:56:36

+0

'malloc'返回未初始化的數據。它不會返回零填充塊。如果你想要零數據,請查看'calloc'。 – Mat 2011-05-23 20:57:04

0

那麼,有這樣的事實,你在主代碼中有insertTail,但代碼中有addTail

+0

由提問者修復。 – Mat 2011-05-23 20:59:03

0

您正在使用'malloc',它在將它交還給我之前沒有清除(用零填充)它分配的內存空間。在你的第一種情況下(添加頭部),addTail只是簡單地將新分配的節點作爲列表頭部,並完成非常可能非空的'next'字段。

  1. 嘗試使用釋放calloc(1,的sizeof(節點))