And*_*rew 2 c printf linked-list segmentation-fault
我一直在阅读链接列表的斯坦福教程.我使用了一个创建三个数字(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;
}
}
Run Code Online (Sandbox Code Playgroud)
这个工作:
#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;
}
}
Run Code Online (Sandbox Code Playgroud)
在不工作的版本,你忽略了返回值BuildOneTwoThree
,并分配未初始化的局部变量head
的main
(这是不一样的,在同名的局部变量BuildOneTwoThree
范围)的变量current
.
因此,打印代码应使用:
struct node* head = BuildOneTwoThree();
current = head;
Run Code Online (Sandbox Code Playgroud)
相反,要使用head
分配的节点BuildOneTwoThree()
,并分配给main
头部指针.