结构体综述与联合体

 结构体位段:

例如:

struct tagPIM
    {
        unsigned char ucPim1;
        unsigned char ucData0 : 1;
        unsigned char ucData1 : 2;
        unsigned char ucData2 : 3;
    }*pstPimData;

char ucpim1占用一个字节

而ucData0在第二个字节中只占1个比特位

ucDATa1在第二个字节中占用2个比特位

ucData2在第二个字节中占用3个比特位

若在其中任何一个过程中前面的变量已经将一个字节占下剩余的空间不足以放下一个变量,

则令创建一个字节为下一个变量存储。

例如

  struct tagPIM
    {
        unsigned char ucPim1;
        unsigned char ucData0 : 1;
        unsigned char ucData1 : 5;
        unsigned char ucData2 : 3;
    }pstPimData;
    printf("%d", sizeof(pstPimData));

此时打印结果为pstPimData的大小为3个字节,即开创第四个变量的时候第二个字节已经放不下了,则直接浪费第二个字节的前两个比特位,另外开创第三个字节存储ucData2。

结构体内存对齐:

struct A{
char a;
cahr b;
int c;
};

struct B{
char a;
int b;
char c;
};

例如上述案例,结构体中元素是一样的,但是所占的内存空间不同;

前者占8个字节,而后者占12个字节。

vs环境默认的对齐数为8,所求对齐数为类型与默认对齐数大小的较小值。

规则:

1.存储一个变量必须要处于字节对齐数的整数倍

2.所有变量存储结束以后,整体所占字节大小要求能被结构体中最大变量所占字节大小整除。

3.如果结构体嵌套,则嵌套的结构体的对齐数为嵌套的结构体自身变量中的最大变量所占字节。

联合体:

union Un
{
	short s[7];
	int n;
};

联合体中所有变量所占字节均为重复使用。

联合体大小必须能被其包含的所占字节最大变量整除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值