Не могу понять, почему я продолжаю получать ошибку сегментации для этого кода

#c #linked-list

#c #связанный список

Вопрос:

Очень простой код:

 typedef struct node {
    int x;
    struct node* next;
} *Node;

void advance_node(Node ptr) {
    ptr = ptr->next;
    while (ptr) {
        printf("%dn", ptr->x);
        ptr = ptr->next;
    }
}

int main() {
    Node node1 = malloc(sizeof (*node1));
    Node node2 = malloc(sizeof (*node2));
    Node node3 = malloc(sizeof (*node3));

    node1->x = 1;
    node1->next = node2;

    node2->x = 4;
    node2->next = node3;

    node3->x = 9;
    node3->next = NULL;

    advance_node(node1);
    return 0;
}
 

Я ожидаю увидеть выходные данные 4 и 9, но я продолжаю получать ошибку сегментации. В чем моя ошибка? Это сводит меня с ума.

Комментарии:

1. Также проверка while(ptr) после чтения ptr приведет к проблемам с пустыми списками.

2. Я предполагаю, что список не пуст.

3. У меня нет ошибки / предупреждения при компиляции даже в -pedantic -Wall -Wextra случае проблем с выполнением, но мне не нравится Node node1 = malloc(sizeof (*node1)); , и я очень удивлен, что это разрешено (узел 1 уже существует?), Можете ли вы проверить выполнение sizeof(struct node) для всех трех?

4. Я ненавижу эти скрытые указатели typedef …

5. Кажется, работает нормально: ideone.com/jfRhV9 — вы пробовали пошагово просматривать код с помощью отладчика, чтобы увидеть, где происходит ошибка segfault (и какие значения у вас есть в вашем указателе в то время)?

Ответ №1:

Вероятно, вы получаете ошибку seg из-за NULL указателя.

Вы можете легко защититься от этого в своей advance_node функции следующим образом:

 void advance_node(Node ptr) {
    if(!ptr) return; //protect against NULL pointer
    ptr = ptr->next;
    while (ptr) {
        printf("%dn", ptr->x);
        ptr = ptr->next;
    }
}
 

Я внес это изменение и протестировал ваш код здесь: https://onlinegdb.com/B1endJr9E

Комментарии:

1. Почему должно node1 быть null? И даже если это так, программа потерпела бы крах, node1->x = 1; поэтому это решение на самом деле не работает.

Ответ №2:

Попробуйте объявить свою структуру как

 typedef struct node {
    int x;
    struct node* next;
} Node;
 

Затем используйте Node *node1 = malloc(sizeof (*node1));