1 #include <stdio.h> 2 #include <stdint.h> 3 #include <systypes/format.h> 4 5 #define FMT32x "%" pFMT32 "x" 6 #define FMT64x "%" pFMT64 "x" 7 #define OFFSET(obj, mem) ((char *) &(obj)->mem - (char *) obj) 8 9 struct A 10 { 11 uint32_t a; 12 uint64_t b; 13 uint64_t c; 14 } __attribute__ ((packed)); 15 16 struct B 17 { 18 uint32_t a; 19 uint64_t b; 20 uint64_t c; 21 }; 22 23 struct C 24 { 25 uint32_t a; 26 uint32_t b; 27 uint64_t c; 28 }; 29 30 int main(int argc, char *argv[]) 31 { 32 (void) argc; (void) argv; 33 34 struct A a = {1, 2, 3}; 35 struct B b = {1, 2, 3}; 36 struct C c = {1, 2, 3}; 37 uint32_t m[6] = {1, 2, 3, 4, 5, 6}; 38 struct A *ma = (struct A *) m; 39 struct A *ma1 = (struct A *) (m + 1); 40 41 printf("a.a @ offset %d = " FMT32x "\n", OFFSET(&a, a), a.a); 42 printf("a.b @ offset %d = " FMT64x "\n", OFFSET(&a, b), a.b); 43 printf("a.c @ offset %d = " FMT64x "\n\n", OFFSET(&a, c), a.c); 44 printf("b.a @ offset %d = " FMT32x "\n", OFFSET(&b, a), b.a); 45 printf("b.b @ offset %d = " FMT64x "\n", OFFSET(&b, b), b.b); 46 printf("b.c @ offset %d = " FMT64x "\n\n", OFFSET(&b, c), b.c); 47 printf("c.a @ offset %d = " FMT32x "\n", OFFSET(&c, a), c.a); 48 printf("c.b @ offset %d = " FMT32x "\n", OFFSET(&c, b), c.b); 49 printf("c.c @ offset %d = " FMT64x "\n\n", OFFSET(&c, c), c.c); 50 printf("ma.a @ offset %d = " FMT32x "\n", OFFSET(ma, a), ma->a); 51 printf("ma.b @ offset %d = " FMT64x "\n", OFFSET(ma, b), ma->b); 52 printf("ma.c @ offset %d = " FMT64x "\n\n", OFFSET(ma, c), ma->c); 53 printf("ma1.a @ offset %d = " FMT32x "\n", OFFSET(ma1, a), ma1->a); 54 printf("ma1.b @ offset %d = " FMT64x "\n", OFFSET(ma1, b), ma1->b); 55 printf("ma1.c @ offset %d = " FMT64x "\n\n", OFFSET(ma1, c), ma1->c); 56 57 return 0; 58 }