https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107339
--- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> --- That is because with the non pointer case gcc can figure out the alignment without having to assume via pointers. Note the original code is also undefined by the c standard even the non pointer case you gave, it just happens to work is not a reason to depend on it.