Изменить
second_f = container_of(&node_first, struct fox, list);
на
second_f = container_of(&first_f.list, struct fox, list);
Объяснение :
Это не имеет ничего общего с ядром или Linux, это C и G CC.
Строка
struct fox first_f = {.tail_length=3, .weight=4, .is_fantastic=0, .list=node_first};
копирует содержимое node_first
в first_f.list
. first_f
НЕ является контейнером node_first
, он содержит копию node_first
.
Если вы хотите, чтобы first_f
был контейнером node_first
, вам нужно определить:
struct fox first_f = {.tail_length=3, .weight=4, .is_fantastic=0, .list={.prev=NULL, .next=NULL}};
struct list_head *node_first = &first_f.list;
т.е. определить node_first
как указатель на член first_f
.
Обратите внимание, что вы могли бы определить struct fox
, чтобы иметь
struct fox
{
// ...
struct list_head *list;
};
вместо
struct fox
{
// ...
struct list_head list;
};
, то есть struct fox
указывает на list_head
, и тогда ваш исходный main()
будет работать.
Но это просто неправильный способ использования list_head
, list_head
предназначен для содержания в других структурах.