У всего этого есть шанс быть законным по одной-единственной причине: объект массива 2D int
переосмысливается как массив объектов char
. В то время как в общем случае реинтерпретация памяти приводит к неопределенному поведению, спецификация языка явно допускает реинтерпретации «массива [подписанного / без знака] символа» для объектов любого типа.
Однако, одна формальная проблема безопасности все еще существует. Язык не гарантирует, что любая битовая комбинация является допустимым значением типа char
. Ваша попытка прочитать переинтерпретированную память через тип char
теоретически может вызвать неопределенное поведение, если встретится представление прерывания для char
. Чтобы быть в безопасности здесь, вы должны использовать тип unsigned char
, который является единственным типом, который не имеет представлений ловушек. Конечно, платформу с ловушкой char
можно смело назвать «экзотической».
Между тем, ваш sizeof(a + 1)
, похоже, не имеет никакого смысла. a + 1
является выражением типа int *
. Почему вы хотите использовать размер указателя для увеличения значения x
в этом случае мне неясно. Чего вы пытались достичь?
Что касается отсутствия предупреждений ... Я бы не ожидал, что компилятор выдаст здесь какие-либо предупреждения. GCC часто предупреждает о пробуксовке типов (реинтерпретация памяти), но, поскольку char
реинтерпретации явно разрешены (как я уже говорил выше), здесь нет никаких предупреждений. Более того, явное приведение обычно имеет тенденцию подавлять любые предупреждения, так как они являются способом сообщить компилятору, что вы действительно хотите что-то сделать независимо от того, насколько это неправильно и / или опасно.