NAME

offsetof - 구조체 멤버의 내부 위치

SYNOPSIS

#include <stddef.h>

size_t offsetof(type, member);

DESCRIPTION

매크로 offsetof()는 구조체 type의 시작점 기준 member 필드의 위치를 반환한다.

이 매크로가 유용한 이유는 구조체를 이루는 필드들의 크기가 구현에 따라 다를 수 있으며 컴파일러가 필드들 사이에 패딩 바이트들을 다르게 삽입할 수도 있기 때문이다. 그렇기 때문에 한 요소의 오프셋이 반드시 앞쪽 요소들의 크기의 합으로 정해지지 않는다.

member가 바이트 경계에 정렬되어 있지 않으면 (즉 비트 필드이면) 컴파일러 오류가 발생하게 된다.

RETURN VALUE

offsetof()는 주어진 type 내에서 주어진 member의 바이트 단위 오프셋을 반환한다.

CONFORMING TO

POSIX.1-2001, POSIX.1-2008, C89, C99.

EXAMPLES

리눅스/i386 시스템에서 gcc(1) 기본 옵션으로 컴파일 할 때 아래 프로그램이 다음 출력을 내놓는다.

$ ./a.out
offsets: i=0; c=4; d=8 a=16
sizeof(struct s)=16

프로그램 소스

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
    struct s {
        int i;
        char c;
        double d;
        char a[];
    };

    /* 컴파일러에 따라 출력이 다름 */

    printf("offsets: i=%zu; c=%zu; d=%zu a=%zu\n",
            offsetof(struct s, i), offsetof(struct s, c),
            offsetof(struct s, d), offsetof(struct s, a));
    printf("sizeof(struct s)=%zu\n", sizeof(struct s));

    exit(EXIT_SUCCESS);
}

2020-11-01