为什么此代码会产生分段错误?

时间:2019-07-30 19:01:10

标签: c linked-list

我试图实现将节点插入到单链列表中。编译器在代码的遍历部分产生了分段错误。

struct Node *start=NULL;

void traverse() 
{
    struct Node *t;
    t=start;
    if(t==NULL)
    {
        printf("Linked list is empty\n");
        return;
    }
    printf("there are %d elements in linked list",count);

    while (t != NULL) 
    { 
        printf(" %d ",t->data); 
        t=t->next; 
    } 
    printf(" %d ",t->data);
}

运行代码后:

Shaons-Air:VSC shaon$ cd "/Users/shaon/Desktop/VSC/" && gcc linkedlist.c -o linkedlist && "/Users/shaon/Desktop/VSC/"linkedlist
1.insert at the beginning2.insert at the end3.traverse
1
enter element
2
1.insert at the beginning2.insert at the end3.traverse
1
enter element
3
1.insert at the beginning2.insert at the end3.traverse
3
Segmentation fault: 11

2 个答案:

答案 0 :(得分:1)

看下面的代码:

while (t != NULL)   // Keep repeating until t is NULL
{ 
    printf(" %d ", t->data); 
    t=t->next; 
} 
printf(" %d ",t->data);  // Now t is NULL but still you dereference it ...
              ^^^
              dereference a NULL

因此,您继续进行操作,直到tNULL,然后再进行t->data!那是崩溃。

只需删除最后一个printf,因为您已经打印了所有元素。

答案 1 :(得分:1)

所以当t指向最后一个节点

t-> next = null 而你

t = t->next;
  

//所以t =空

那么当你这样做

  

printf(“%d”,t-> data);

由于t为空并且没有任何数据部分,因此会产生段错误