柔性数组
结构体中最后一个元素允许是未知大小的数组,这就叫柔性数组成员
柔性数组特点:
- 结构体中柔性数组前面必须包含一个其他类型的成员。
- 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;
}
标签:struct,int,成员,联合体,位段,数组,柔性 来源: https://blog.csdn.net/weixin_46383092/article/details/120469745
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。