2017-04-17 46 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; 
}