打印链接列表时出现分段错误

时间:2015-03-16 00:58:04

标签: c linked-list segmentation-fault printf

我一直在阅读链接列表的斯坦福教程。我使用了一个创建三个数字(1,2,3)列表的函数。函数本身不打印结果,所以我决定自己测试一下。但是,当我运行它时,它会给我分段错误。

话虽如此,当我删除该函数并将代码复制到main时,它可以工作。有人可以解释为什么主要功能不起作用?

这是给我分段错误的代码:

#include <stdio.h>
#include <stdlib.h>

      struct node {
         int            data;
         struct node*   next;
};

struct node* BuildOneTwoThree() 

{
   struct node* head = NULL;
   struct node* second = NULL;
   struct node* third = NULL;
   head = malloc(sizeof(struct node));
   second = malloc(sizeof(struct node));
   third = malloc(sizeof(struct node));

head->data = 1;
head->next = second;
second->data = 2;
second->next = third;
third->data = 3;
third->next = NULL;

return head;

}


int main()

{
   struct node* head;
   struct node* second;
   struct node* third;
   struct node*   next;

   int data;

   BuildOneTwoThree();

   struct node* current = head;



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

      current= current->next;

   }

}

这个有效:

#include <stdio.h>
#include <stdlib.h>

      struct node {
         int            data;
         struct node*   next;
};



int main()

{

   int data;

   struct node* head = NULL;
   struct node* second = NULL;
   struct node* third = NULL;
   head = malloc(sizeof(struct node));
   second = malloc(sizeof(struct node));
   third = malloc(sizeof(struct node));

head->data = 1;
head->next = second;
second->data = 2;
second->next = third;
third->data = 3;
third->next = NULL;

   struct node* current = head;



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

      current= current->next;

   }

}

1 个答案:

答案 0 :(得分:5)

在不起作用的版本中,您忽略BuildOneTwoThree的返回值,并从head分配未初始化的本地变量main(与本地不同变量BuildOneTwoThree范围内current范围内同名变量)。

因此,打印代码应使用:

struct node* head = BuildOneTwoThree();
current = head;

相反,要使用head中分配的BuildOneTwoThree()节点,并分配给main的头指针。