Scroll to navigation

OFFSETOF(3) Linux Programmer's Manual OFFSETOF(3)

名前

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.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2014-04-06 GNU