这段C语言代码是否违反严格别名规则?请说明原因
问题解答
这段代码没有违反严格别名规则,你的猜测并不正确,具体原因如下:
1. 结构体类型的本质一致性
你通过宏#define STRUCT struct {int x; char y;}定义了一个匿名结构体,随后用typedef STRUCT my_struct_t给这个匿名结构体类型起了别名my_struct_t。也就是说:
STRUCT *data展开后是struct {int x; char y;} *datamy_struct_t*就是struct {int x; char y;} *的别名
这两个指针类型本质是完全相同的类型,而非“未共享标签的不兼容类型”。C语言中,typedef只是给现有类型起别名,不会创建新类型,因此STRUCT*和my_struct_t*指向的是同一个结构体类型。
2. 严格别名规则的适用场景
严格别名规则禁止的是用不兼容的指针类型访问同一对象(例外情况包括用char*访问任意类型对象、兼容类型之间的访问等)。而在这段代码中:
data指向的对象是struct {int x; char y;}类型,强制转换为my_struct_t*后,依然是用同类型指针访问该对象get函数中通过data->x和data->y访问成员,本质是通过正确的结构体类型指针访问其成员,完全符合规则
3. 关于结构体兼容性补充
即使是两个独立定义的结构体(非typedef别名),只要它们在同一翻译单元内具有完全相同的成员序列(成员类型、顺序、名称均一致),那么这两个结构体类型也是兼容的,用兼容类型的指针访问对象也不会违反严格别名规则。而你的代码中连“兼容”都算不上,直接是同一类型,自然不存在问题。
内容的提问来源于stack exchange,提问作者user1806687
相关产品推荐
相关产品推荐

