Я использую в своем проекте C структуру list_head для определения связанного списка. В некоторых условиях мне нужно разобрать список из второго элемента, но в этом случае я получаю дополнительный элемент со значением мусора. Я попытался с помощью небольшой программы на моем компьютере смоделировать тот же сценарий. У меня такая же проблема:
#include<stdio.h>
#include<stdlib.h>
#include "list.h"
struct struct_report{
struct list_head list;
char *report;
};
//Add an element to the linked list
void add_report_to_list(struct list_head *reports, char *report) {
struct struct_report *report_strct;
report_strct = calloc(1, sizeof(struct struct_report));
list_add_tail(&report_strct->list, reports);
report_strct->report= strdup(report);
}
int main() {
struct struct_report *retreport;
LIST_HEAD(reports); //instantiate a struct list_head instance
add_report_to_list(&reports, "elt1");
add_report_to_list(&reports, "elt2");
add_report_to_list(&reports, "elt3");
add_report_to_list(&reports, "elt4");
list_for_each_entry(retreport, &reports, list){
printf("============> no next retreport: %s\n", retreport->report);
}
printf("\n");
list_for_each_entry(retreport, reports.next, list){
printf("============> Next retreport: %s\n", retreport->report);
}
return 1;
}
list.h совпадает с linux: https://github.com/torvalds/linux/blob/master/include/linux/list.h.
В результате выполнения я получаю следующий след:
============> no next retreport: elt1
============> no next retreport: elt2
============> no next retreport: elt3
============> no next retreport: elt4
============> Next retreport: elt2
============> Next retreport: elt3
============> Next retreport: elt4
============> Next retreport:
Понятно, что в случае, если я начинаю парсить нормально с первого элемента, у меня нет никаких проблем. Но если я начинаю со второго элемента в списке, я получаю дополнительный со странным значением, вроде мусора.
Есть ли объяснение, почему я получаю дополнительный элемент? А как можно поправить парсить до elt4?
LIST_HEAD(reports);
? Поле.next
нигде не определено. Что такоеlist_for_each_entry()
? Часть`list_for_each_entry (...) {printf ...} выглядит странно. Пожалуйста, отредактируйте свой вопрос, чтобы добавить эту информацию вместо добавления комментария. - person Bodo   schedule 20.09.2019list_for_each_entry
функции иstruct list_head
структуры - person Rishikesh Raje   schedule 20.09.2019