container_of
- #include <assert.h>
- #define container_of(ptr, type, member) \
- ((type *)((char *)(ptr)-(char *)(&((type *)0)->member)))
- struct child {
- int id;
- };
- struct parent {
- int id;
- struct child child;
- };
- int main(int argc, char** argv)
- {
- struct child child = {2};
- struct parent parent = {1, child};
- struct child *p_child = &parent.child;
- struct parent *p_parent;
- p_parent = container_of(p_child, struct parent, child);
- assert(p_parent->id == 1);
- return 0;
- }
container_of позволяет получить указатель на структуру, содержащий заданный элемент, поэтому в примере хранить указатель на родителя в структуре child не нужно.