offsetof -
構造体のメンバーのオフセットを返す
#include <stddef.h>
size_t offsetof(type, member);
offsetof()
マクロは、フィールド
member の 構造体
type
の先頭からのオフセットを返す。
このマクロが有用なのは、
構造体を構成するフィールドのサイズは実装によって変化するし、
コンパイラによりフィールド間に挿入するパディングのバイト数も
違う可能性があるからである。
その結果、あるエレメントのオフセットは必ずしもそれより前の
エレメントのサイズの合計とはならない。
member
がバイト境界に位置していない場合
(すなわち、ビットフィールドの場合)
には、
コンパイラでエラーが発生する。
offsetof() は、指定された
member の指定された
type
の中でのオフセットを、バイト単位で返す。
POSIX.1-2001, POSIX.1-2008, C89, C99.
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=%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);
}
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。