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