container_of(ptr, type, member)

원형은 다음과 같다.
#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





+ Recent posts