C语言笔记——结构体和位段

115 阅读1分钟

​​​​一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

 位段

什么是位段:

1.位段的成员必须是int unsigned int signed int

2.位段的成员名后边有一个冒号和一个数字

例:

struct A
{
	int _a : 2;
	int _b : 5;
	int _c : 10;
	int _d : 30;
};

位段内存分配

1.位段的成员可以是int unsigned int,signed int,或者是char(属于整型家族)类型

2.位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的

3.位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段

struct S
{
	int _a : 2;
	int _b : 5;
	int _c : 10;
	int _d : 30;
};

int main()
{
	struct S s;
	printf("%d\n", sizeof(s));

	return 0;
}

输出结果为:8

位段的跨平台问题

1.int位段被当成有符号数还是无符号数是不确定的

2.位段中最大位的数目不能确定

3.位段中的成员在内存中是从左向右分配还是从右向左分配标准尚未定义

4.当一个结构包含两个位段,第二个位段成员比较打大,无法容纳于第一个位段剩余位时,是舍弃剩余的位还是利用,是不确定的

总结:与结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是存在跨平台的问题

​​

结构体的基础知识

结构是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同的变量。

结构的声明

struct Stu
{
	//成员变量
	char name[20];
	short age;
	char tele[12];
	char sex[5];
}s1,s2,s3;//s1,s2,s3是三个全局的结构体变量
int main()
{
	struct  Stu s;//局部的结构体变量


	return 0;
}

typedef struct Stu
{
	char name[20];
	short age;
	char tele[12];
	char sex[5];

}Stu;//类型
int main()
{
	struct  Stu s;//局部的结构体变量


	return 0;
}

\