OFFSETOF(3) | Руководство программиста Linux | OFFSETOF(3) |
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=%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); }
2019-03-06 | GNU |