Сбой программы списка ссылок на malloc - PullRequest
0 голосов
/ 03 декабря 2018

Я довольно плохо знаком с 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 голосов
/ 03 декабря 2018

Вы выделяете 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 снова указывают на head, а именно NULL, что составляет currentNULL

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));");
0 голосов
/ 03 декабря 2018

Проблема в том, что ваш 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;

Это должно решить вашу проблему.

...