在C中,将结构实例强制转换为其他类型的正确方法是什么 这里的C++类似的问题: #包括 类型定义结构s1{ }s1; 类型定义结构s2{ }s2; int main(){ s1a; s2 b; b=*(s2*)和a; 返回0; }

在C中,将结构实例强制转换为其他类型的正确方法是什么 这里的C++类似的问题: #包括 类型定义结构s1{ }s1; 类型定义结构s2{ }s2; int main(){ s1a; s2 b; b=*(s2*)和a; 返回0; },c,C,使用位转换是实现这一点的唯一方法吗?C标准没有为结构提供转换,也没有通过问题中所示的指针转换定义重新解释。(某些此类重新解释适用于C 2018 6.5 7中规定的类型组合,但不适用于独立结构。)该标准提供了另外两种将对象重新解释为另一种类型的方法 首先,可以简单地将一个对象的字节复制到另一个: _Static_assert(sizeof a == sizeof b, "a and b must be the same size."); memcpy(&b, &

使用位转换是实现这一点的唯一方法吗?

C标准没有为结构提供转换,也没有通过问题中所示的指针转换定义重新解释。(某些此类重新解释适用于C 2018 6.5 7中规定的类型组合,但不适用于独立结构。)该标准提供了另外两种将对象重新解释为另一种类型的方法

首先,可以简单地将一个对象的字节复制到另一个:

_Static_assert(sizeof a == sizeof b, "a and b must be the same size.");
memcpy(&b, &a, sizeof b);
对于小对象,一个启用了优化的好编译器很可能会从内存或寄存器中删除副本并直接解释新类型中的数据

第二,一个人可以向一个工会成员储存信息,并通读另一个工会成员(C 2018 6.5.2.3 3,见脚注99):

括号中的联合类型以复合文字开头。
{a}
a
作为联合的初始值,特别是对于
s1
成员。然后
.s2
访问
s2
成员


请注意,尽管出于某种安全考虑,包含了
\u Static\u assert
,但您还必须确保结构布局与您的目的兼容。

我相信您可以在两个
结构之间使用
并集。
来实现这一点。
代码实现了什么?如果它是自己完成强制转换的,那么它就是这样做的,但除了代码是无效的,因为空结构是无效的。也就是说,
什么是正确的方式
-什么是“正确”的方式?它将
a
转换为
b
而不是它本身。你在这里想做什么?这个代码没有任何意义。如果要复制它,请使用
memcpy()
并确保两者的大小相同。这似乎违反了。
_Static_assert(sizeof a == sizeof b, "a and b must be the same size.");
memcpy(&b, &a, sizeof b);
_Static_assert(sizeof a == sizeof b, "a and b must be the same size.");
b = (union { struct s1 s1; struct s2 s2; }) {a} .s2;