gpt4 book ai didi

C 结构体中 char[] 的大小

转载 作者:行者123 更新时间:2023-11-30 21:13:52 24 4
gpt4 key购买 nike

我知道什么是填充以及对齐方式如何工作。给定以下结构:

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 需要偶数偏移。由于前面的字符长度均匀,因此不需要填充。所以 a 位于偏移量 10 处。
  • b 需要一个可被 4 整除的偏移量。12 可被 4 整除,因此 12 是 b 的精确偏移量。
  • 整个结构体的大小需要能被 4 整除,因为该结构体数组中的每个 b 都需要满足上述要求。但由于我们目前的尺寸为 16,因此不需要任何填充。

    WWWWWWWWWWAABBBB|-- 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

关于C 结构体中 char[] 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59881123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com