Si l'alignement semble être votre problème, regardez pragma pack
. Les noms de la structure/union ne font que référencer le bloc de mémoire alloué, si st_t.a est déplacé dans la structure en ajoutant d'autres membres, votre casting échouera, mais s'il reste le premier membre, il fonctionnera puisque tous les membres de l'union pointent vers la même adresse que l'union elle-même.
Voir la section 9.2.17 - 21 de la norme C++ : "Un pointeur vers un objet struct de format standard, convenablement converti à l'aide d'un reinterpret_cast, pointe vers son membre initial (ou si ce membre est un champ de bits, alors vers l'unité dans laquelle il réside) et vice versa."
Voir également la section 9.5 Unions : " 1. Dans une union, au plus un des membres de données non statiques peut être actif à tout moment, c'est-à-dire que la valeur d'au plus un des membres de données non statiques peut être stockée dans une union à tout moment ". [Note : Une garantie spéciale est faite afin de simplifier l'utilisation des unions : Si une union standard-layout contient plusieurs structures standard-layout qui partagent une séquence initiale commune (9.2), et si un objet de ce type d'union standard-layout contient l'une des structures standard-layout, il est permis d'inspecter la séquence initiale commune de n'importe lequel des membres de la structure standard-layout ; voir 9.2. - note de fin ] La taille d'une union est suffisante pour contenir le plus grand de ses membres de données non statiques. Chaque membre de données non statique est alloué comme s'il était le seul membre d'une struct."