c - 结构中的 C Sizeof char[]
问题描述
我知道填充是什么以及对齐是如何工作的。鉴于以下结构:
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
.
编辑:我明白了。
解决方案
在像这样的结构中
struct {
char word[10];
short a;
int b;
}
您有以下要求:
a
需要一个均匀的偏移量。由于 char 数组在其长度之前是偶数,因此不需要填充。所以a
位于偏移量 10。b
需要一个可被 4 整除的偏移量。12 可被 4 整除,因此 12 是b
.整个结构需要一个可被 4 整除的大小,因为
b
该结构的数组中的每个都需要具有上述要求。但由于我们目前的尺寸为 16,我们不需要任何填充。WWWWWWWWWAABBBB |-- 10 --| 2 4 = 16
将此与
struct {
char word[11];
short a;
int b;
}
在这里,a
偏移量为 11。这是不允许的,因此插入了填充。a
偏移量为 12 就可以了。
b
然后将获得 14 的偏移量,这也是不允许的,因此添加了 2 个字节。b
偏移量为 16。整个结构的大小为 20,这对于数组中的所有后续项都很好。
WWWWWWWWWWW.AA..BBBB
|-- 11 --|1 2 2 4 = 20
第三个例子:
struct {
char word[11];
int b;
short a;
}
(注意更改的顺序!)
b
对 12 的偏移量感到满意(它得到 1 个填充字节),
a
对 16 的偏移量感到满意。(之前没有填充。)
然而,在结构之后,添加了 2 个字节的填充,以便结构与 4 对齐。
WWWWWWWWWW..BBBBAA..
|-- 10 --| 2 4 2 2 = 20
推荐阅读
- java - java 库插件 - gradle
- android - 可以毫无问题地构建,但部署到 Android 设备时出现 NoSuchMethodError 异常
- c# - 如何创建多层次的 JSON 对象?
- php - mysqli_fetch_array() 中的警告
- functional-programming - 关于 Agda 中的平等
- php - PHP如何获取文件读取下一个lLine
- machine-learning - 有没有办法将自定义测试数据传递到 XGBoost 预测模型中?
- java - 有人可以解释一下,java递归是如何工作的,特别是在下面的这个程序中?
- c# - 在 iOS 中调用 Web 服务时,Xamarin 表单 ios 出现异常
- python - 如何使用 'id' 打印所有值: