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
位于偏移量10处a
需要一个可除以4的偏移量。12可除以4,因此12是b
的精细偏移量b
- 整个结构需要一个可除以4的大小,因为此结构数组中的每个
都需要具有上述要求。但由于我们目前的尺码是16码,我们不需要任何填充物 wwwwwwwwaabbb |--10--| 2 4=16b
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