- C Library - Home
- C Library - <assert.h>
- C Library - <complex.h>
- C Library - <ctype.h>
- C Library - <errno.h>
- C Library - <fenv.h>
- C Library - <float.h>
- C Library - <inttypes.h>
- C Library - <iso646.h>
- C Library - <limits.h>
- C Library - <locale.h>
- C Library - <math.h>
- C Library - <setjmp.h>
- C Library - <signal.h>
- C Library - <stdalign.h>
- C Library - <stdarg.h>
- C Library - <stdbool.h>
- C Library - <stddef.h>
- C Library - <stdio.h>
- C Library - <stdlib.h>
- C Library - <string.h>
- C Library - <tgmath.h>
- C Library - <time.h>
- C Library - <wctype.h>
- C Programming Resources
- C Programming - Tutorial
- C - Useful Resources
C library - offsetof() macro
The C library offsetof(type, member-designator) Macro results in a constant integer of type size_t which is the offset in bytes of a structure member from the beginning of the structure. The member is given by member-designator, and the name of the structure is given in type.
This macro is commonly used in data structure like a linked list.
Syntax
Following is the C library syntax of the offsetof() Macro −
offsetof(type, member-designator)
Parameters
This function accepts only two parameter −
type − This is the class type in which member-designator is a valid member designator.
member-designator − This is the member designator of class type.
Return Value
This macro returns the value of type size_t which is the offset value of member in type.
Example 1
Following is the C library program that illustrates the offsetof() Macro.
#include <stddef.h>
#include <stdio.h>
struct address {
char name[50];
char street[50];
int phone;
};
int main () {
printf("name offset = %d byte in address structure.\n",
offsetof(struct address, name));
printf("street offset = %d byte in address structure.\n",
offsetof(struct address, street));
printf("phone offset = %d byte in address structure.\n",
offsetof(struct address, phone));
return(0);
}
Output
On execution of above code, we get the following result −
name offset = 0 byte in address structure. street offset = 50 byte in address structure. phone offset = 100 byte in address structure.
Example 2
Below the example iilustrates the importance of macro offsetof() which is useful for creating a data structure(linked list).
#include <stdio.h>
#include <stddef.h>
struct Node {
int data;
struct Node* next;
};
int main() {
size_t offset = offsetof(struct Node, data);
printf("Offset of 'data' in Node: %zu bytes\n", offset);
return 0;
}
Output
After executing the above, we get the following result −
Offset of 'data' in Node: 0 bytes
Example 3
The program demonstrates how to find the offset of a specific member within a structure using the offsetof() macro.
#include <stdio.h>
#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))
typedef struct tutorialspoint
{
int i;
double d;
char z;
} tutortype;
int main()
{
printf("%lu", OFFSETOF(tutortype, z));
getchar();
return 0;
}
Output
The above code produces the following result −
16