offsetof − 構 造 体 の メ ン バ ー の オ フ セ ッ ト を 返 す
#include <stddef.h>
size_t offsetof(type, member);
offsetof() マ ク ロ は 、 フ ィ ー ル ド member の 構 造 体 type の 先 頭 か ら の オ フ セ ッ ト を 返 す 。 こ の マ ク ロ が 有 用 な の は 、 構 造 体 を 構 成 す る フ ィ ー ル ド の サ イ ズ は 実 装 に よ っ て 変 化 す る し 、 コ ン パ イ ラ に よ り フ ィ ー ル ド 間 に 挿 入 す る パ デ ィ ン グ の バ イ ト 数 も 違 う 可 能 性 が あ る か ら で あ る 。 そ の 結 果 、 あ る エ レ メ ン ト の オ フ セ ッ ト は 必 ず し も そ れ よ り 前 の エ レ メ ン ト の サ イ ズ の 合 計 と は な ら な い 。
member が バ イ ト 境 界 に 位 置 し て い な い 場 合 (す な わ ち 、 ビ ッ ト フ ィ ー ル ド の 場 合 ) に は 、 コ ン パ イ ラ で エ ラ ー が 発 生 す る 。
offsetof() は 、 指 定 さ れ た member の 指 定 さ れ た type の 中 で の オ フ セ ッ ト を 、 バ イ ト 単 位 で 返 す 。
C89, C99, POSIX.1-2001.
Linux/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=%ld; c=%ld; d=%ld a=%ld\n",
(long) offsetof(struct s, i),
(long) offsetof(struct s, c),
(long) offsetof(struct s, d),
(long) offsetof(struct s, a));
printf("sizeof(struct s)=%ld\n", (long)
sizeof(struct s));
exit(EXIT_SUCCESS); }