C Sizeof char[] 在结构中

Osc*_*hty -3 c byte struct sizeof

我知道什么是填充以及对齐是如何工作的。鉴于以下结构:

typedef struct {
char word[10];
short a;
int b;  
} Test;
Run Code Online (Sandbox Code Playgroud)

我不明白 C 如何解释和对齐结构内的 char 数组。它应该是 9 个字符 + 终止符,它应该被认为是最长的,如下所示:

| - _ - _ - _ - _ - word - _ - _ - _ - _ - |
| - a - | - _ - b - _ - | padding the remaining 4 bytes
Run Code Online (Sandbox Code Playgroud)

“-”代表一个字节,“_”分隔字节。所以我们有 10 字节长的字,2 字节长的 a 和 4 字节长的 b 以及 4 字节的填充。但是当我打印 sizeof(Test) 它返回16.

编辑:我明白了。

glg*_*lgl 5

在像这样的结构中

struct {
    char word[10];
    short a;
    int b;  
}
Run Code Online (Sandbox Code Playgroud)

您有以下要求:

  • 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;  
}
Run Code Online (Sandbox Code Playgroud)

在这里,a会有偏移量 11。这是不允许的,因此插入了填充。a偏移量为 12 就可以了。

b然后将获得 14 的偏移量,这也是不允许的,因此添加了 2 个字节。b得到 16 的偏移量。整个结构的大小为 20,这对于数组中的所有后续项都很好。

WWWWWWWWWWW.AA..BBBB
|--  11 --|1 2 2   4 = 20
Run Code Online (Sandbox Code Playgroud)

第三个例子:

struct {
    char word[11];
    int b;  
    short a;
}
Run Code Online (Sandbox Code Playgroud)

(注意顺序更改!)

b对 12 的偏移量感到满意(它获得 1 个填充字节), a对 16 的偏移量感到满意。(在它之前没有填充。)

然而,在结构体之后,添加了 2 个字节的填充,以便结构体与 4 对齐。

WWWWWWWWWW..BBBBAA..
|-- 10 --| 2   4 2 2 = 20
Run Code Online (Sandbox Code Playgroud)