C offsetof() Macro 함수

C offsetof() Macro 함수

offsetof() Macro 함수를 분석한다.

1. offsetof()

1
#define offsetof(TYPE, MEMBER) ((sizet) &((TYPE *)0)->MEMBER)
[Code 1] offsetof() Macro 함수

offsetof() Macro 함수는 Struct를 구성하는 Member 변수의 Memory Offset을 구하는 함수이다. [Code 1]은 offsetof() Macro 함수를 나타내고 있다. offsetof() Macro 함수는 다음과 같이 동작한다.

  • (TYPE *)0 : 주소는 0이고 이 주소는 TYPE 구조체의 포인터이다.
  • &((TYPE *)0)->MEMBER : MEMBER의 Offset을 구한다.
  • ((sizet) &((TYPE *)0)->MEMBER) : 구한 Offset을 sizet로 Type Casting한다.

2. 예제

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

struct offset{
    int a;
    int b;
    char c;
    double d;
    int e;
};

int main(void)
{
    printf("a : %d\n", offsetof(struct offset, a));
    printf("b : %d\n", offsetof(struct offset, b));
    printf("c : %d\n", offsetof(struct offset, c));
    printf("d : %d\n", offsetof(struct offset, d));
    printf("e : %d\n", offsetof(struct offset, e));

    return 0;
}
[Code 2] offsetof() MACRO 함수 예제
a : 0
b : 4
c : 8
d : 12
e : 20
[Shell 1] offsetof() MACRO 함수의 예제 출력

offsetof() Macro 함수를 통해서 offset Struct의 각 Member 변수의 Memory Offset을 확인할 수 있다.