结构赋值是否保证填充也相等

时间:2017-06-06 17:16:05

标签: c struct language-lawyer

假设我有一个包含2个字段的结构和C的实现,我在这些字段之间也有一些填充。

如果我创建了struct的两个变量并将它们分配给另一个,那么填充是否会保证相等?

我知道对于大多数编译器来说都是如此(因为它们只调用memcpy),但是我想知道标准中有关填充的内容是什么?

对此问题的意图是,我可以使用memcmp来检查结构的相等性。

假设我有一个编译器,它发出的代码只是分配结构的所有成员而不是执行memcpy,它是否是struct操作赋值的有效实现?

3 个答案:

答案 0 :(得分:6)

标准在note 51 of 6.2.6.1 General中说:

  

因此,例如,结构分配不需要复制任何填充位。

答案 1 :(得分:6)

6.2.6.1一般
...
6当值存储在结构或联合类型的对象中时,包括在成员中 object,对象表示的字节,对应于任何填充字节 未指定的值。 51)结构或联合对象的值永远不是陷阱表示,即使结构或联合对象的成员的值可能是 陷阱表示。

7当值存储在union类型的对象的成员中时,该对象的字节数 表示与该成员不对应但与其他成员对应的表示 取未指定的值。 51)因此,例如,结构分配不需要复制任何填充比特。

C 2011 Online Draft

脚注51直接解决了您的问题 - 填充位的内容可能无法在分配中复制,因此memcmp可能无法比较两个structs的相等性。

答案 2 :(得分:1)

我认为你不能使用memcmp,因为成员之间的内存(即“padding”-area中的内容)不能保证具有某个值,并且分配这样的结构-object to another也不需要复制填充内容。