А мне интересно: зачем было делать union (да еще и с двумя
абсолютно одинаковыми типами, но разными именами - смысл?), когда
там char и uint8_t? Достаточно было вместо него просто написать
uint8_t data[0]… Ну, а учитывая то, что вряд ли выравнивание даст возможность меньше 4 байт под эту вещь выделить, то сразу: uint8_t *data. И вуаля!
А, и packed там нафиг не нужно.