Хорошо ли определен этот тип наказания?
struct result{
int a,b,c,d;
}
union convert {
int arr[4];
struct result res;
}
int arr1[4] = {1,2,3,5};
union convert *pointer = (union convert *) arr1;
(union convert *) arr1
риск сбоя выравнивания.
Указатель на тип объекта может быть преобразован в указатель на другой тип объекта. Если результирующий указатель неправильно выровнен для ссылочного типа, поведение не определено . C11dr §6.3.2.3 8
Не требуется, чтобы union convert
и int
имели одинаковое выравнивание Например, union convert
требования могут превышать int
.
Рассмотрим такую возможность: arr1[]
живет на int
улице, где все адреса кратны 4. union
и struct
друзья живут на "кратной 8" улице. arr1[]
может иметь адрес 0x1004 (не кратный 8).
В 2019 году сбои выравнивания чаще всего наблюдаются при char
(требуется 1) и других типах, требующих 2 или более. В случае выбора OP, я сомневаюсь, что у реальной платформы будут проблемы с выравниванием, но неправильное выравнивание остается возможным.
Этот тип ударов не имеет четкого определения.
Дополнительные проблемы
Другие ответы и комментарии обсуждение заполнение вопросов, которые дополнительно выявляют проблемы.
@ Eric Postpischil комментарий о неправильном доступе с pointer->res.a
добавляет больше причин для рассмотрения этого UB.