不同类型指针的共用体是否符合公共初始序列规则?跨字段free合法吗?
共用体指针字段跨成员释放内存的合法性与公共初始序列规则分析
原代码操作的合法性
你贴的第一段代码里,给bar.u.long_entries赋值malloc返回的指针,再通过bar.u.entries释放内存,这个操作是合法的。原因如下:
malloc返回的本质是堆内存的起始地址,所有对象指针类型(非函数指针)在标准C实现里的内存表示都是兼容的,互相转换不会改变底层的地址值。- 共用体的所有成员共享同一块内存空间,所以
bar.u.long_entries和bar.u.entries存储的是同一个指针值,只是被解释成了不同的指针类型。 free仅要求传入由malloc/calloc/realloc返回的指针(或NULL),不管这个指针当前被声明成什么类型,只要地址值正确就没问题。
关于公共初始序列规则
这个场景不适用公共初始序列规则。因为公共初始序列规则是针对结构体类型的共用体成员:当共用体里的两个结构体成员拥有相同的初始字段序列(类型、顺序均一致)时,才允许通过其中一个成员访问另一个成员的公共初始部分。而你的共用体成员是不同类型的指针,并非结构体,所以和这条规则完全无关。
修改后代码的合法性
你修改后的代码确实是完全合规的写法:
- 用
void*存储malloc返回的指针是标准操作,void*可以隐式转换为任何对象指针类型,所以把bar.entries转换成long*使用完全符合C标准。 - 最后用原始的
bar.entries调用free,完全满足free的参数要求,没有任何问题。
内容的提问来源于stack exchange,提问作者franso
相关产品推荐
相关产品推荐

