|
|
1
30
不,数组元素之间永远不会有填充。这是特别不允许的。c99标准调用数组类型“数组类型描述了一组连续分配的非空对象…”。相比之下,结构是“顺序的”,而不是“连续的”分配。 一个结构中的数组前后可能有填充物;这完全是另一种动物。编译器可能这样做是为了帮助结构的对齐,但是C标准没有对此做任何说明。 |
|
|
2
8
小心点。填充可以添加到结构的末尾,但不会在问题中所述的数组元素之间添加。数组始终引用连续的内存,尽管一个结构数组可能在每个元素中添加了填充,作为结构本身的一部分。
在您的示例中,
|
|
|
3
3
这是关于 为什么? 结构可能需要在其成员之间填充,甚至在其最后一个成员之后填充,以及数组不填充的原因:
不同的类型可能有不同的对齐要求。有些类型需要在单词边界上对齐,另一些类型需要在双甚至四个单词边界上对齐。为了实现这一点,结构的成员之间可以包含填充字节。可能需要尾随填充字节,因为直接位于结构的内存位置也必须符合结构的对齐要求,即如果
生成指向的有效指针
由于数组的每个“成员”都有相同的对齐要求,因此没有理由引入填充。这对于包含在结构中的数组也适用:如果数组的第一个元素正确对齐,那么下面的所有元素也是如此。 |
|
|
4
1
是的,差不多。变量通常与某些边界对齐,这取决于变量。举个例子:
在我的系统上,double和char分别是8和1字节。总计9。然而,这个结构将是16个字节,因此双精度数将始终是8字节对齐的。如果我刚刚使用了ints、chars等,那么对齐方式可能是1、2、4或8。
对于T型,
通常,这完全依赖于编译器和体系结构。实际上,这并不重要。 |
|
|
5
0
考虑:
假设短裤是16位的,而你是32位的,那么尺寸会 可能 为8字节,因为每个结构成员倾向于对齐一个单词(在本例中为32位)边界。我之所以说“可能”,是因为它是特定于实现的行为,可以通过编译器标志等来改变。 值得强调的是,这是C标准不一定定义的实现行为。很像短裤、英特和多头的尺寸(C标准简单地说短裤不会比英特大,而多头也不会比英特小,最终可以是16/32/32、16/32/64、32/32/64或其他一些配置)。 |
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 1 年前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
Bobby · 复合字面值总是左值吗? 1 年前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 1 年前 |