位段 联合体

柔性数组

结构体中最后一个元素允许是未知大小的数组,这就叫柔性数组成员

柔性数组特点:

  • 结构体中柔性数组前面必须包含一个其他类型的成员。
  • sizeof返回的结构体的大小不包括柔性数组的大小。
  • 包含柔性数组成员的结构体使用,要配合动态内存开辟函数(malloc)使用。
//柔性数组的使用
struct st_type
{
    int i;
    int a[];
}
int main()
{
    //创建struct st_type类型的对象
    struct st_type* p=(struct st_type)malloc(sizeof(struct st_type)+sizeof(int)*10);
}

位段

位段中的位指的是二进制位。

struct A
{
	int _a : 2;//占2个位
	int _b : 4;//占4个位
	int _c : 6;//占6个位
};

位段的内存分配

  • 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
  • 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
  • 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

位段的跨平台问题

  • 位段中最大位的数目不确定。(16位机下int为18个bit,而32位下是32bit)。
  • 位段中成员在内存中是从左向右分配还是从右向左分配这是标准尚未定义的。
  • 当结构体包含两个位段成员时,第二个位段比较大,第一个位段剩余的位无法容纳第二个位段时,是丢弃还是利用,这是标准尚未定义的。

联合体(共用体)

共用体顾名思义就是共同使用一块空间,所以共用体的大小 最小应该是成员中 最大的成员的大小。(因为共用体得有能力保存最大的成员)。

//定义
union A
{
    short b;
    int a;
}
联合体的大小如何计算

联合体的大小最小是 联合体中最大的成员的大小。

如果不是最大对齐数的整数倍还需要对齐到最大对齐数的整数倍。

面试题–判断大小端
#include<stdio.h>
union A
{
	int a;
	char b;
};
int main()
{
	union A a;
	a.a = 1;
	if (a.b == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值