C 언어
Cpp 언어
Kotlin
Android App
알고리즘
Git/CI/CD
offsetof
C에서는 때로 구조체 내 멤버변수들의 Offset을 사용할 경우가 있다.
 
아래의 구조체를 보도록 하자.
typedef struct student {
    char name[10];
    int age;
    double score;
    char address[20];
} STUDENT;
 
이 구조체를 변수로 선언할 시,메모리에 아래 그림과 같이 구성될 것이다. 
(4Byte 단위로 Align되 있다고 가정함)
 
이 때, 각 멤버인 name, age, score, address의 Offset을 직접 구하는 방법은 아래와 같다.
#define MEMBER_OFFSET(type, member) (void *)(&(((type *)0)->member))
 
위와 같은 매크로를 작성하여 사용하면, 구조체(type) 내의 멤버(member)의 Offset을 확인할 수 있다.
원리는 간단한데, 메모리 0번지를 type *형식으로 캐스팅하여 해당 멤버의 address를 구해오는 방식이다.
 
STUDENT 구조체의 각 멤버변수의 Offset을 위의 매크로로 확인해보자.
MEMBER_OFFSET(STUDENT, name); -> 0x00
MEMBER_OFFSET(STUDENT, age); -> 0x0C
MEMBER_OFFSET(STUDENT, score); -> 0x10
MEMBER_OFFSET(STUDENT, address); -> 0x18

보통 Open Source에서는 이러한 방법을 응용하여 많이 사용중이다.
 
 
Open Source에서의 사용 예시 :
[C] container_of 매크로 : https://acanel.xyz/public/langC/11에서 offsetof() 매크로로 사용됨