C结构中字符[]的大小

C结构中字符[]的大小,c,struct,byte,sizeof,C,Struct,Byte,Sizeof,我知道什么是填充,以及对齐是如何工作的。给定以下结构: typedef struct { char word[10]; short a; int b; } Test; 我不明白C如何解释和对齐结构中的字符数组。它应该是9个字符+终止符,并且应该被视为最长的,如下所示: | - _ - _ - _ - _ - word - _ - _ - _ - _ - | | - a - | - _ - b - _ - | padding the remaining 4 bytes “-”表示一个字节,

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

typedef struct {
char word[10];
short a;
int b;  
} Test;
我不明白C如何解释和对齐结构中的字符数组。它应该是9个字符+终止符,并且应该被视为最长的,如下所示:

| - _ - _ - _ - _ - word - _ - _ - _ - _ - |
| - a - | - _ - b - _ - | padding the remaining 4 bytes
“-”表示一个字节,而“x”分隔字节。我们有10个字节长的字,2个字节长的a和4个字节长的b,还有4个字节的填充。但是当我打印sizeof(Test)时,它返回
16


编辑:我知道了。

通常,每个变量将在其大小的边界上对齐。
(除非应用了
packed
等属性)

正在进行完整的讨论,部分内容如下:

字符(一个字节)将按1字节对齐。
短(两个字节)将以2字节对齐。
int(四个字节)将以4字节对齐。
长(四个字节)将以4字节对齐。
浮点(四个字节)将按4字节对齐。
双精度(8字节)在Windows上是8字节对齐,在Windows上是4字节对齐 Linux(8字节,带-malign双编译时选项)。
long long(八个字节)将以4字节对齐。

因此,您的结构布局如下:

typedef struct {
char word[10];
// Aligned with beginning of structure; takes bytes 0-9

short a;
// (assuming short is 2-bytes)
// Previous member ends on byte 9, this one starts on byte-10.
// Byte 10 is a multiple of 2, so no padding necessary
// Takes bytes 10 and 11

int b;        
// Previous member ends on byte 11, next byte is 12, which is a multiple of 4.  
// No padding necessary
// Takes bytes 12, 13, 14, 15.
} Test;
总大小:16字节。

如果你想玩它,把你的单词数组改成9或11字节, 或者颠倒
short
int
的顺序,您将看到结构的大小发生变化。

在:

struct
{
    char word[10];
    short a;
    int b;  
}
给定两个字节的
short
和四个字节的
int
,结构在内存中布局:

Offset Member 0 word[0] 1 word[1] 2 word[2] 3 word[3] 4 word[4] 5 word[5] 6 word[6] 7 word[7] 8 word[8] 9 word[9] 10 a 11 a 12 b 13 b 14 b 15 b 以类似结构的方式

struct {
    char word[10];
    short a;
    int b;  
}
您有以下要求:

  • a
    需要均匀偏移。由于字符在长度为偶数之前到达,因此不需要填充。因此
    a
    位于偏移量10处
  • b
    需要一个可除以4的偏移量。12可除以4,因此12是
    b
    的精细偏移量
  • 整个结构需要一个可除以4的大小,因为此结构数组中的每个
    b
    都需要具有上述要求。但由于我们目前的尺码是16码,我们不需要任何填充物

    wwwwwwwwaabbb |--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
。四个字节的填充是从哪里来的?谁说这个结构需要填充?很抱歉变量错误,我编辑了这个问题,而你发布链接的问题没有回答我的问题。我不确定链接的问题是否回答了这个问题。但是,简而言之,只有在下列字段需要时才有填充。一个短的只需要填充到一个偶数地址(resp.offset),这个地址在一个偶数大小的数组之后。后面的int需要一个可以被4整除的偏移量,它有。而整个结构只需要有一个长度模的最长的单一类型(即4),消除了填充需要在最后。16的长度很好,没有线条。一个结构包含它的所有成员,按照内存顺序(它们之间可能有填充),所有成员都彼此分离。工会成员相互重叠。在工会中,所有成员都是重叠的。要得到一个聚合,其中一些成员是分开布置的,一些是重叠的,您必须使用一个包含结构的并集。谢谢,我想我现在知道了。每个变量必须在其大小的边界上对齐。除非它是压缩的。“每个变量必须在其大小的边界上对齐。”嗯?不是。每个C实现都有自己的对齐规则。它们不需要是对象大小的函数。
WWWWWWWWWW..BBBBAA..
|-- 10 --| 2   4 2 2 = 20