Это технически неопределенное поведение, и в стандарте ничего не говорится о результатах наложения указателей на подобные. Специалист по стандартам сказал бы, что вызов такого неопределенного поведения может привести к чему угодно - от поврежденных данных до сбоя системы - Рагнаруку.
Прагматично, это зависит от вашего оборудования. Большинство современных систем (например, x86, x64, PPC, MIPS, ARM) обрабатывают записи размером с слово так, как вы описываете, за исключением того, что запись по невыровненному адресу приведет к сбою. Кроме того, это когда в игру вступает порядок байтов; в системе с прямым порядком байтов
char foo[4];
*((uint_32*)(foo)) = 0x01020304;
// the following are now true:
foo[0] == 0x04;
foo[1] == 0x03;
foo[2] == 0x02;
foo[3] == 0x01;
Короткий ответ: это небезопасно, если вы точно не знаете, на каком оборудовании будет работать ваша программа.
Если вы делаете , управляете оборудованием, для которого вы компилируете, тогда вы можете предсказать, что будет делать компилятор; Я использовал этот прием для ускорения упаковки байтовых массивов во встроенных системах.