Bonjour, je suis en train d'étudier la gestion des listes chaînées sous linux (list.h) et on se rend compte qu'il y a une macro "container_of".
Cette macro est définie dans "kernel.h" mais je n'arrive pas à comprendre son fonctionnement et particulierement le "((type *)0)->member )" il semblerait qu'on cast 0 mais dans quelle utilité ?
Pouvez-vous m'indiquer, s'il vous plait, le fonctionnement de cette macro.
J'ai une autre question, pour ne pas utiliser les pointeurs NULL, ils utilisent deux pointeurs, je comprends pas le choix de ces adresses spécifiquement et le danger du pointeur NULL.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 /** * container_of - cast a member of a structure out to the containing structure * * @ptr: the pointer to the member. * @type: the type of the container struct this is embedded in. * @member: the name of the member within the struct. * */ #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );})
Merci.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 /* * These are non-NULL pointers that will result in page faults * under normal circumstances, used to verify that nobody uses * non-initialized list entries. */ #define LIST_POISON1 ((void *) 0x00100100) #define LIST_POISON2 ((void *) 0x00200200)
Partager