链接列表程序在malloc上崩溃

时间:2018-12-03 08:59:14

标签: c linked-list malloc

我一般对C和编码尚不熟悉,所以请耐心等待。我最近一直在尝试实现链接列表,这是我想出的代码

typedef struct something{
    int data;
    struct something *next;
} thing ;

int main ()
{
thing *head, *current;

head=malloc(sizeof(thing));
puts("head=malloc(sizeof(thing));");

if (head != NULL)
    puts("malloc success");

head=NULL;

current=head;
puts("current=head;");
if (current == NULL)
    puts("current is NULL");


puts("while");
while (current!=NULL)
{
    current = current->next;
}
puts("end while");


current->next=malloc(sizeof(thing));
puts("current->next=malloc(sizeof(thing));");

//free at end of program
}

虽然编译器显示0错误,但是当我运行程序时,它只会运行直到崩溃前的最后malloc部分。它不会运行最后的puts,所以我认为这与我尝试使用malloc的方式有关。 我很乐意找人告诉我我做错了什么。

2 个答案:

答案 0 :(得分:3)

问题是您的while循环进行得很远。您想在current指向列表的最后一个元素时停止,以便添加它。但是,您可以更进一步,并在current == NULL时停止。然后为时已晚,无法分配给current->next

首先,您需要将head->next初始化为NULL。

head = malloc(sizeof(thing));
head->next = NULL;

摆脱这一行:

head = NULL;

因为这将覆盖malloc()的结果。

然后,您的while循环需要测试current->next,而不是current本身:

while (current->next != NULL) {
    current = current->next;
}

添加新节点时,还必须将其next指针设置为NULL

current->next = malloc(sizeof(thing));
current->next->next = NULL;

这些应该可以解决您的问题。

答案 1 :(得分:1)

您分配了head,然后在经过几次检查后立即将其指针指向NULL

// Allocation here

head=malloc(sizeof(thing));
puts("head=malloc(sizeof(thing));");

// Not a null 
if (head != NULL)
    puts("malloc success");

// Point to NULL again ???
head=NULL;

然后您的current指向headNULL,这使current NULL

current=head;
puts("current=head;");
if (current == NULL)
    puts("current is NULL");

然后您取消引用current并尝试malloc

puts("while");
while (current!=NULL)
{
    current = current->next;
}
puts("end while");


current->next=malloc(sizeof(thing)); //current is NULL here NULL->next is invalid
puts("current->next=malloc(sizeof(thing));");