【发布时间】:2020-01-23 14:43:23
【问题描述】:
我知道填充是什么以及对齐的工作原理。给定以下结构:
typedef struct {
char word[10];
short a;
int b;
} Test;
我不明白 C 如何解释和对齐结构内的 char 数组。应该是9个字符+终止符,最长的应该是这样的:
| - _ - _ - _ - _ - word - _ - _ - _ - _ - |
| - a - | - _ - b - _ - | padding the remaining 4 bytes
“-”代表一个字节,“_”分隔字节。所以我们有 10 字节长的字、2 字节长的 a 和 4 字节长的 b 以及 4 字节的填充。但是当我打印 sizeof(Test) 它返回16。
编辑:我明白了。
【问题讨论】:
-
您的解释和变量名不匹配。没有
c。 -
你从哪里得到四个字节的填充?谁说这个结构需要填充?
-
抱歉变量错误,我编辑了问题,您发布链接的问题没有回答我的问题。
-
我不确定链接的问题是否能回答这个问题。但是,简而言之,如果以下字段需要它,您只有填充。短只需要填充到偶数地址(resp。偏移量),您在偶数大小的数组之后拥有该地址。并且它后面的 int 需要一个可以被 4 整除的偏移量,它具有。并且整个结构只需要一个长度模其最长的单一类型(即 4),消除最后的填充需要。 16的长度就很好了。
-
没有行。一个结构包含它的所有成员,在内存中按顺序排列(可能在它们之间有填充),它们都是相互分离的。工会与成员重叠。在联合中,所有 成员是重叠的。要获得一个聚合,其中一些成员单独布局,一些成员重叠,您必须使用包含结构的联合。