我听说有传言说,在C中,包含在结构中的数组可能在数组的元素之间添加了填充.显然,填充量不能在任何元素对之间变化,或者使用简单的指针算法计算数组中的下一个元素是不可能的.
这个谣言还指出,结构中没有包含的阵列保证不包含填充物.我知道至少那部分是真的.
因此,在代码中,谣言是:
{
// Given this:
struct { int values[20]; } foo;
int values[20];
// This may be true:
sizeof(values) != sizeof(foo.values);
}
Run Code Online (Sandbox Code Playgroud)
我非常肯定sizeof(values)
会永远相等sizeof(foo.values)
.但是,我无法在C标准(特别是C99)中找到明确证实或否认这一点的任何内容.
有谁知道这个谣言是否在任何C标准中得到解决?
编辑:我知道在数组foo.values
的结尾和结构的结尾之间可能存在填充foo
,并且标准声明在开始foo
和开始之间不存在填充foo.values
.但是,是否有人引用或引用标准,其中表示元素之间没有填充foo.values
?
Chr*_*uin 31
不,在数组的元素之间永远不会有填充.这是特别不允许的.C99标准调用数组类型"数组类型描述了连续分配的非空对象集......".相反,结构是"顺序地",而不是"连续地"分配.
在结构中的数组之前或之后可能存在填充; 这完全是另一种动物.编译器可能会这样做以帮助对齐结构,但C标准没有说明这一点.
小心点.填充可以在结构的末尾添加,但不会在您在问题中声明的数组元素之间添加.数组总是引用连续的内存,尽管结构数组可能会在每个元素中添加填充作为结构本身的一部分.
在您的示例中,values
和foo.values
数组将具有相同的大小.任何填充都将成为结构的一部分foo
.