typedef struct { char ch; int num; } st_t;
typedef union { char *pch; st_t *pst; } un_t;
st_t st;
st.ch = 's';
un_t un = { &st.ch };
*un.pch = 'u';
printf("%c\n", un.pst->ch); // expect: print the letter 'u'
Насколько мне известно, адрес первого члена структуры и адрес самих структур одинаковы, поэтому un
мог как точка st
и st.ch
в в то же время путем доступа к pst
и pch
. Тем не менее, стандарт C99 кажется, что он никогда явно не говорит the sizes of different types of pointers are identical. Тогда, моя забота о том, будет ли код поврежден, например, нарушать правила строгих правил псевдонимов, быть неопределенным поведением и т. Д.?Союза различных типов и размеров указателей
Примечание: C99 не является текущим стандартом C. Это будет C11. Возможно, вы захотите прочитать о конверсиях указателей и т. Д. Одной из проблем, с которыми вы могли столкнуться, является нарушение правила правильного типа (aka strict aliasing), как вы упомянули. Это вызовет неопределенное поведение (UB не является проблемой сам по себе, но является результатом нарушения правила/ограничения. – Olaf