首页 > 解决方案 > 结构中的 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.

编辑:我明白了。

标签: cstructbytesizeof

解决方案


在像这样的结构中

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

推荐阅读