Преобразования указателя опасны.
Если тип указателя, из которого выполняется преобразование, недостаточно выровнен для целевого типа, вы получите UB (== неопределенное поведение; прочитайте, что это, если вы уже не) уже при преобразовании.
В противном случае, если вы обычно получаете UB при разыменовании, потому что строгие правила псевдонимов C требуют, чтобы вы обращались к объектам через типы lvalue, достаточно совместимые с их эффективным типом.
Хотя последний абзац не совсем применим к преобразованиям в указатели на символы, так как указатели на символы могут иметь псевдоним любого типа, предупреждение (компиляторы также могут сделать это серьезной ошибкой) по-прежнему полезно, поскольку преобразование все еще опасно.
printf("%d", *(char*)&(int){0xFFFF});
даст вам только первый байт (это зависит от порядка байтов, является ли он наиболее значимым или наименее значимым), напечатав 255 (если тип реализации char
не подписан) или -1 (если он подписан).
printf("%d", *&(int){0xFFFF});
даст вам всебайты, находящиеся в int
.
Если компилятор позволяет назначить char *
из int *
только с предупреждением, он должен вести себя так же, как и при приведении, но вам нужноприведение в соответствие вашего C (и компилятор, который молчит о преобразовании).