结构体存储
struct test
{
char num;
int year;
char data;
};
int main()
{
struct test stu={19,12,13};
//printf("%x\n",&stu);11
printf("字节数是:%d",sizeof(stu));
return 0;
}
程序的执行结果会是什么
并不是我们预期的8字节,这里就要说到结构体的存储方式了
结构体存储:
(1)第一个结构体成员存储在结构体首地址偏移量为0的地址处
(2)后面的每一个成员存储位置相对于起始地址的偏移量取决于自身的大小(字节数)和一个被称为对齐数的数字
(对齐数 = 该成员变量的字节数与编译器默认对齐数之比的较小值)
偏移量 = 对齐数的最小整数倍(每个成员的对齐数不一定相同)
编译器默认对齐数由于编译器不同而有所差异在visual Studio中的默认值是8,在visual Studio中,可以使用: #pragma pack(m)//设置默认对齐数为m
(3)结构体的大小(所占字节数)= 成员变量中最大对齐数的整数倍
就上面的代码块(visual Studio):第一个成员char 占一个字节,偏移量为0第二个成员为int占4个字节,对齐数为4,偏移量就是4,又是小段模式,因此,第二个成员的起始位置相对偏移量就是4,第三个成员char占一个字节,对齐数尾1,偏移量就是8目前占用了9个字节,但是结构体的实际占用内存是,最大对齐数的整数倍(4*3)12个字节
调试结果:
结构体起始地址,占用字节数
内存情况:
修改如下代码
struct test
{
int year;
char num;
char data;
};
int main()
{
struct test stu={19,12,13};
printf("%x\n",&stu);11
printf("字节数是:%d",sizeof(stu));
return 0;
}
再观察结果
调试结果:
内存情况: