В проекте Pintos есть макрос, который преобразует указатель, как я написал в заголовке.
#define list_entry(LIST_ELEM, STRUCT, MEMBER)
((STRUCT *) ((uint8_t *) &(LIST_ELEM)->next
- offsetof (STRUCT, MEMBER.next)))
(в src / lib / kernel / list.h)
Почему этоне так ли?
#define list_entry(LIST_ELEM, STRUCT, MEMBER)
((STRUCT *) ((uint8_t *)LIST_ELEM
- offsetof (STRUCT, MEMBER)))