container_of(ptr, type, member)
원형은 다음과 같다.
ptr : 멤버의 포인터
type : 이 멤버를 포함하고 있는 컨테이너 스트럭쳐의 타입
member : type structure에 안에서 존재하는 멤버의 이름
결론적으로 얘기하자면 container_of 매크로는 구조체 멤버의 포인터를 이용하여 구조체의 시작 주소를 찾는 역할을 한다.
예제 코드)
결과)
원형은 다음과 같다.
#define offsetof(type, member) ((size_t) &((type *)0)->member) #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );})
ptr : 멤버의 포인터
type : 이 멤버를 포함하고 있는 컨테이너 스트럭쳐의 타입
member : type structure에 안에서 존재하는 멤버의 이름
결론적으로 얘기하자면 container_of 매크로는 구조체 멤버의 포인터를 이용하여 구조체의 시작 주소를 찾는 역할을 한다.
예제 코드)
#include <stdio.h> #define offsetof(type, member) ((size_t) &((type *)0)->member) #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) struct type { char ttt; int *member; } con; int main() { printf("%p\n", &con); printf("%p\n", container_of(&(con.member), struct type, member)); return 0; }
결과)
0x80496ec 0x80496ec