Этот код печатает разные значения после компиляции с помощью -O1
и -O2
(как gcc, так и clang):
#include <stdio.h>
static void check (int *h, long *k)
{
*h = 5;
*k = 6;
printf("%d\n", *h);
}
union MyU
{
long l;
int i;
};
int main (void)
{
union MyU u;
check(&u.i, &u.l);
return 0;
}
Я думаю, что это должно быть поведение undefined из-за сглаживания указателя, но я не могу точно определить, какая часть кода запрещена.
Он записывает один элемент объединения, а затем читает от другого, но согласно Отчет о дефектах № 283", который разрешен. Является ли это UB, когда элементы объединения доступны через указатели, а не напрямую?
Этот вопрос похож на доступ к членам союза C через указатели, но я думаю, что на него никогда не отвечали полностью.