#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));