结构体存储

结构体存储

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;
}   

再观察结果

调试结果:
在这里插入图片描述
内存情况:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值