我有这段代码
struct Student {
char name[48];
float grade;
int marks[10,5];
char gender;
};
Student s;
现在我必须得到sizeof s
所以我添加了
printf("%d",sizeof(s));
现在当我点击编译时显示的结果是256
而且错了,因为它应该是253
因为
的大小char name [48]; ----> 48
和
浮动等级; -----> 4
和
int marks [10,5]; ------> 200
和
char性别; -------→1
所以48 + 4 + 200 + 1 = 253
那为什么告诉我256?
================================
这部分是在我看到你的答案之后写的
我了解到了
假设我有这样的结构: struct { char a [3]; short int b; long int c; char d [3]; };
所以......
+-------+-------+-------+
| a |
+-------+-------+-------+
| b |
+-------+-------+-------+-------+
| c |
+-------+-------+-------+-------+
| d |
+-------+-------+-------+
在packed'' version, notice how it's at least a little bit hard for you and me to see how the b and c fields wrap around? In a nutshell, it's hard for the processor, too. Therefore, most compilers will
pad''结构中(好像有额外的,不可见的字段),如下所示:
+-------+-------+-------+-------+
| a | pad1 |
+-------+-------+-------+-------+
| b | pad2 |
+-------+-------+-------+-------+
| c |
+-------+-------+-------+-------+
| d | pad3 |
+-------+-------+-------+-------+
所以,如果Im的最大大小为200,那么填充应该是
48 + 152
4 + 196
200 + 0
1 + 199
使它们成为完美的形状
答案 0 :(得分:16)
结构的成员之间或结构的末尾可能有填充字节。
在这种情况下,可能在结构的末尾有三个字节的填充,在单个char成员之后,以确保结构的大小是四的倍数。
答案 1 :(得分:3)
编译器将结构填充以与字边界对齐。处理器处理256字节的块比处理像253这样的奇数更容易。
答案 2 :(得分:2)
int marks[10,5];
应该是
int marks[10][5];
还可能存在填充和对齐问题。
答案 3 :(得分:2)
如果使用Visual C ++,请将#pragma pack(1)
添加到源文件的顶部以消除struct padding。 VC ++的默认值是8字节边界。
gcc和其他编译器将拥有自己的等价物。