offsetof - смещение элемента структуры
offsetof(3)
смещение элемента структуры
ОБЗОР
#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=%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);
}