offsetof - смещение
элемента
структуры
Standard C library (
libc,
-lc)
#include <stddef.h>
size_t offsetof(type, member);
Макрокоманда
offsetof()
возвращает
смещение
поля
member от
начала
структуры
type.
Эта
макрокоманда
удобна, так
как
размеры
полей,
составляющих
структуру,
могут
значительно
изменяться
в
зависимости
от
реализаций,
а
компиляторы
могут
добавлять
различное
количество
дополнительных
байт между
полями.
Следовательно,
смещение
элемента
не всегда
является
суммой
размеров
предыдущих
элементов.
Если
member не
выровнен
по границе
байта (т.е.,
если это
битовое
поле), то
компилятор
вернёт
ошибку.
Функция
offsetof()
возвращает
смещение в
байтах
указанного
поля
member
внутри
указанного
type.
POSIX.1-2001, POSIX.1-2008, 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);
}
Русский
перевод
этой
страницы
руководства
был сделан
Azamat Hackimov <
[email protected]>, Konstantin Shvaykovskiy
<
[email protected]>, Yuri Kozlov <
[email protected]> и
Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]