NAME
offsetof - offset of a structure member
SYNOPSIS
#include <stddef.h>
size_t offsetof(type, member);
DESCRIPTION
The macro offsetof() returns the offset of the field member from the start of the structure type.
This macro is useful because the sizes of the fields that compose a structure can vary across implementations, and compilers may insert different
numbers of padding bytes between fields. Consequently, an element's offset is not necessarily given by the sum of the sizes of the previous ele‐
ments.
A compiler error will result if member is not aligned to a byte boundary (i.e., it is a bit field).
RETURN VALUE
offsetof() returns the offset of the given member within the given type, in units of bytes.
CONFORMING TO
C89, C99, POSIX.1-2001.
EXAMPLE
On a Linux/i386 system, when compiled using the default gcc(1) options, the program below produces the following output:
$ ./a.out
offsets: i=0; c=4; d=8 a=16
sizeof(struct s)=16
Program source
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
struct s {
int i;
char c;
double d;
char a[];
};
/* Output is compiler dependent */
printf("offsets: i=%ld; c=%ld; d=%ld a=%ld\n",
(long) offsetof(struct s, i),
(long) offsetof(struct s, c),
(long) offsetof(struct s, d),
(long) offsetof(struct s, a));
printf("sizeof(struct s)=%ld\n", (long) sizeof(struct s));
exit(EXIT_SUCCESS);
}
offsetof - offset of a structure member
SYNOPSIS
#include <stddef.h>
size_t offsetof(type, member);
DESCRIPTION
The macro offsetof() returns the offset of the field member from the start of the structure type.
This macro is useful because the sizes of the fields that compose a structure can vary across implementations, and compilers may insert different
numbers of padding bytes between fields. Consequently, an element's offset is not necessarily given by the sum of the sizes of the previous ele‐
ments.
A compiler error will result if member is not aligned to a byte boundary (i.e., it is a bit field).
RETURN VALUE
offsetof() returns the offset of the given member within the given type, in units of bytes.
CONFORMING TO
C89, C99, POSIX.1-2001.
EXAMPLE
On a Linux/i386 system, when compiled using the default gcc(1) options, the program below produces the following output:
$ ./a.out
offsets: i=0; c=4; d=8 a=16
sizeof(struct s)=16
Program source
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
struct s {
int i;
char c;
double d;
char a[];
};
/* Output is compiler dependent */
printf("offsets: i=%ld; c=%ld; d=%ld a=%ld\n",
(long) offsetof(struct s, i),
(long) offsetof(struct s, c),
(long) offsetof(struct s, d),
(long) offsetof(struct s, a));
printf("sizeof(struct s)=%ld\n", (long) sizeof(struct s));
exit(EXIT_SUCCESS);
}
本文详细介绍了C语言中的offsetof宏,解释了如何使用此宏来获取结构体成员相对于结构体起始位置的偏移量。文中通过示例代码展示了不同类型的成员在结构体中的布局及其偏移情况。
2万+





