我的代码:
typedef struct {
int sizeOfMyIntArray;
int* myIntArray;
float someFloat;
} my_struct_foo;
int main() {
printf("The size of float is: %d\n", sizeof(float));
printf("The size of int is: %d\n", sizeof(int));
printf("The size of int* is: %d\n", sizeof(int*));
printf("The size of my_struct_foo is: %d\n", sizeof(my_struct_foo));
return 0;
}
我想这很简单。虽然,我对这个程序产生的结果感到有些惊讶......
The size of float is: 4
The size of int is: 4
The size of int* is: 8
The size of my_struct_foo is: 24
我有一个浮点数,一个int和一个指向int的指针。在我的脑海里,我在想:4 + 4 + 8 = 16 ......不是24.为什么我的结构24的大小而不是16?
答案 0 :(得分:2)
对齐和填充。 int*
应该在8字节边界上对齐,因此编译器在int
和指针之间以及float
之后(或之前)插入四个字节的填充以使结构的大小是指针大小的倍数,并且指针正确对齐。
如果您对会员重新排序,
typedef struct {
int sizeOfMyIntArray;
float someFloat;
int* myIntArray;
} my_struct_foo;
指针在没有任何填充的情况下正确对齐,因此结构的大小(很可能,编译器允许添加填充,即使它不需要,但我知道没有填充)是16。 / p>