#include <stdio.h>

struct X1 {
  char c1;
  int i;
  char c2;
} x1 = {0xc1, 0x01020304, 0xc2};

struct X2 {
  long l;
  char c;
} x2 = {0x0102030405060708, 0xc1};

struct X3 {
  int i;
  char c1;
  char c2;
} x3 = {0x01020304, 0xc1, 0xc2};

struct X4 {
  struct X2 x;
  char c;
} x4 = {{0x0102030405060708, 0xc1}, 0xc2};

struct X5 {
  char c1;
  char c2;
  char c3;
} x5 = {0xc1, 0xc2, 0xc3};

struct X6 {
  short s1;
  int i;
  char c[3];
  short s2;
} x6 = {0x0102, 0x01020304, {0xc1, 0xc2, 0xc3}, 0x0102};

union U1 {
  int i;
  char c[5];
};

union U2 {
  short s;
  char c[5];
};

void dump (void *p, int n) {
  unsigned char *p1 = p;
  while (n--) {
    printf("%p - %02x\n", p1, *p1);
    p1++;
  }
}

int main(void) {
    int i;

    union U1 u1;
    union U2 u2;

printf("\nx1:\n");
    dump(&x1, sizeof(x1));
printf("\nx2:\n");
    dump(&x2, sizeof(x2));
printf("\nx3:\n");
    dump(&x3, sizeof(x3));
printf("\nx4:\n");
    dump(&x4, sizeof(x4));
printf("\nx5:\n");
    dump(&x5, sizeof(x5));
printf("\nx6:\n");
    dump(&x6, sizeof(x6));

    u1.i = 0x01020304;
printf("\nu1 (int)\n");
    dump(&u1, sizeof(u1));
    for (i = 0; i <5; i++)
      u1.c[i] = 0xcc;
printf("u1 (char)\n");
    dump(&u1, sizeof(u1));

    u2.s = 0x0102;
printf("\nu2 (short)\n");
    dump(&u2, sizeof(u2));
    for (i = 0; i <5; i++)
      u2.c[i] = 0xcc;
printf("u2 (char)\n");
    dump(&u2, sizeof(u2));
  return 0;
}