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