我听说有传言说,在 C 中,包含在结构内部的数组可能在数组元素之间添加了填充。现在显然,任何一对元素之间的填充量都不能变化,或者使用简单的指针算术不可能计算数组中的下一个元素。
该谣言还指出,不包含在结构中的数组保证不包含填充。我至少知道那部分是真的。
因此,在代码中,谣言是:
{
// Given this:
struct { int values[20]; } foo;
int values[20];
// This may be true:
sizeof(values) != sizeof(foo.values);
}
我很确定sizeof(values)
将永远相等sizeof(foo.values)
。然而,我在 C 标准(特别是 C99)中找不到任何明确证实或否认这一点的内容。
有谁知道这个谣言是否在任何 C 标准中得到解决?
edit:我知道数组末尾之间可能有填充foo.values
和结构的末尾foo
并且该标准规定在开始之间不会有填充foo
和开始foo.values
。然而,有没有人有一个引用自 or 参考该标准表示元素之间没有填充foo.values
?
不,数组元素之间永远不会有填充。这是明确不允许的。 C99 标准将数组类型称为“数组类型描述了连续分配的非空对象集...”。相比之下,结构是“顺序”分配的,而不是“连续”分配的。
结构中的数组之前或之后可能有填充;那完全是另一种动物。编译器可能会这样做以帮助结构对齐,但 C 标准对此没有任何说明。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)