2017-04-17 48 views
0

以下功能是否有問題?不知何故,他們正在創建一個段錯誤。調試以下功能(段故障錯誤)

struct processNode* create_node() 
{ 
    struct processNode* newNode = (struct processNode*)malloc(sizeof(struct processNode)); 
    newNode->next = NULL; 
    return newNode; 
} 

struct processNode* append_node(struct processNode* list,struct processNode* newNode) 
{ 
    struct processNode* tracker= NULL; 
    tracker = list; 

    if(tracker == NULL) 
    { 
     tracker = newNode; 
    } 
    else 
    { 
     while(tracker->next != NULL) 
     { 
      tracker =tracker->next; 
     } 
     tracker->next = newNode; 
     tracker = tracker->next; 
    } 

    tracker->next=NULL; 
    tracker = list; 
    return tracker; 
} 

我在C中創建一個shell,需要創建一個鏈接列表來解析用戶的命令行。在第二個函數中,我打算用新添加的指針返回一個新列表;

+1

將'list'視爲NULL。現在走這個功能。 *小心*。你認爲'tracker = list'確實如此(注意:它在該函數中出現兩次*;在'if'塊中出現一次*,在'else'塊之後出現一次*)。嗯。 – WhozCraig

+0

你是否真的試圖在調試器中運行它(根據你的問題的標題)?這應該告訴你哪裏出了問題。我還發現valgrind是這些問題的有用工具,因爲它可能會導致內存分配出錯。 – Evert

+0

[請參閱此討論爲什麼不在'C'中投射'malloc()'和家族的返回值。](http://stackoverflow.com/q/605845/2173917)。 –

回答

1

我想這個函數應該返回一個指向列表頭部的指針。

承擔函數調用listNULL

所以這是好的:

if(tracker == NULL) 
    { 
     tracker = newNode; 
    } 

但這裏

tracker = list; <---- Not good.... 
    return tracker; 

您覆蓋跟蹤器和返回NULL

你可以嘗試像:

struct processNode* append_node(struct processNode* list,struct processNode* newNode) 
{ 
    struct processNode* tracker= NULL; 
    tracker = list; 

    if(tracker == NULL) 
    { 
     tracker = newNode; 
     return tracker;  // Notice 
    } 

    while(tracker->next != NULL) 
    { 
     tracker =tracker->next; 
    } 
    tracker->next = newNode; 

    return list; 
} 
+0

「你覆蓋跟蹤器並返回null」,嗯,這怎麼可能。 List_head是指向同一個list_head指向的相同指針和跟蹤器,因此如果我在最後設置了tracker = list_head,那麼這是一個問題? – daniel

+0

@Daniel'tracker'和'list' **不是**相同的指針。他們是不同的指針。更改'tracker'不會**改變'list'。所以如果你的函數被調用'list'爲NULL,函數返回NULL – 4386427

0

以下情況會給你賽格故障這裏在線tracker->next=NULL;

  1. tracker != NULL && newNode == NULL
  2. tracker == NULL

    .... 
    tracker = tracker->next; 
    } 
    
    //THE FOLLOWING LINE WILL CAUSE PROBLEM 
    tracker->next=NULL; 
    tracker = list; 
    return tracker; 
    .... 
    } 
    

你可以這樣做:

struct processNode* append_node(struct processNode* list,struct processNode* newNode) 
{ 
    struct processNode* tracker= NULL; 
    tracker = list; 

    if(!newNode){ 
     //Do nothing 
    }   
    else if(tracker == NULL) 
    { 
     tracker = newNode; 
    } 
    else 
    { 
     while(tracker->next != NULL) 
     { 
      tracker = tracker->next; 
     } 
     tracker->next = newNode; 
     tracker = tracker->next; 
    } 

    return tracker; 
}