c / expert
Snippet
Intrusive Container Layout via Structure Member Offset Calculations
Intrusive containers embed list/node structs directly inside data objects (as seen in kernel architectures). By using pointer arithmetic and offsetof macro logic, the parent object pointer is retrieved dynamically from embedded node pointers without dynamic node memory allocations.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>#include <stddef.h>struct ListHead {struct ListHead* next;};#define container_of(ptr, type, member) \((type *)((char *)(ptr) - offsetof(type, member)))struct Task {int priority;struct ListHead node;};int main(void) {struct Task t = { .priority = 10 };struct ListHead* ptr = &t.node;struct Task* retrieved = container_of(ptr, struct Task, node);printf("Retrieved task priority: %d\n", retrieved->priority);return 0;}
Breakdown
1
#define container_of(ptr, type, member) ...
Calculates parent structure pointer by subtracting member byte offset from embedded pointer address.
2
offsetof(type, member)
Standard macro returning exact byte offset of specified struct member from structure base.
3
struct Task { int priority; struct ListHead node; };
Embeds generic intrusive container node directly into custom task domain structure.
4
struct Task* retrieved = container_of(ptr, struct Task, node);
Recovers parent Task object reference from standalone ListHead pointer safely.