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에서의 사용 예시 :