为什么sizeof会给我这个结果?

时间:2010-03-26 19:18:21

标签: c++

我有这段代码

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

使它们成为完美的形状

4 个答案:

答案 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和其他编译器将拥有自己的等价物。