名 前
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=%zd; c=%zd; d=%zd a=%zd\n",
offsetof(struct s, i), offsetof(struct s, c),
offsetof(struct s, d), offsetof(struct s, a));
printf("sizeof(struct s)=%zd\n", sizeof(struct
s));
exit(EXIT_SUCCESS); }
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。