2011-05-23 130 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(节点))