我有以下结构体:
typedef struct __attribute__ ((__packed__))
{
uint16_t a;
uint32_t b;
} st_t;
-> "b" 成员未对齐。
当我执行以下操作时,gcc会发出警告:
st_t st;
uint32_t * b_p = &st.b;
*b_p = 0;
警告日志:
taking address of packed member of 'struct <anonymous>' may result in an unaligned pointer value
但是当我执行以下操作时,它没有引发任何警告:
st_t st;
st_t * st_p = &st;
st_p->b = 0;
我不理解为什么在第二种情况下没有引发警告,因为我仍在访问未对齐的成员。
st.b
的地址(由于打包可能会重新排列),而在第二种情况下,您告诉编译器“我要访问st
的b
”,它会带您到那里(即让编译器“找出”如何做到这一点,因为它负责安排地址)? - Zakk