【发布时间】:2016-09-16 17:50:03
【问题描述】:
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。您可能想了解指针转换等。您可能遇到的一个问题是违反了您提到的有效类型(也称为严格别名)规则。这会引发未定义的行为(UB 本身不是问题,而是违反规则/约束的结果。
标签: c pointers undefined-behavior unions strict-aliasing