0
点赞
收藏
分享

微信扫一扫

C语言之结构体(进阶篇)

唯米天空 2022-04-22 阅读 70
c语言

 

1.结构体的内存对齐

struct S1 {
	char c1; //1个字节
	int i;   //4个字节
	char c2; // 1个字节
	
	
	
};
struct S2 {
	char c1; //1个字节
	char c2; //1个字节
	int  i;	 //4个字节
};
int main() {
	struct S1 s1;
	struct S2 s2;
	printf("%d\n", sizeof(s1));
	printf("%d\n", sizeof(s2));
	return 0;
}

 如何计算呢?

掌握结构体的对齐规则:

 为什么存在内存对齐呢?

总的来说:

结构体的内存对齐就是拿空间换时间的做法! 

 

offsetof 

 

#include<stddef.h>
struct S1 {
	char c1; //1个字节
	int i;   //4个字节
	char c2; // 1个字节
	
	
	
};
struct S2 {
	char c1; //1个字节
	char c2; //1个字节
	int  i;	 //4个字节
};
int main() {
	struct S1 s1;
	struct S2 s2;
	printf("%d\n", offsetof(struct S1,c1));
	printf("%d\n", offsetof(struct S1, i));
	printf("%d\n", offsetof(struct S1, c2));
	printf("\n");
	printf("%d\n", offsetof(struct S2, c1));
	printf("%d\n", offsetof(struct S2, c2));
	printf("%d\n", offsetof(struct S2, i));
	return 0;
}

跟上面的两张图s1 s2偏移量的起始位置一模一样 

 这道题就要参考前面写的结构体的内存对齐的规则

小王同学想有没有一种方法可以修改默认对齐数呢?

#pragma pack(1)
struct S1 {
	char c1; //1个字节
	int i;   //4个字节
	char c2; // 1个字节
	
	
	
};
struct S2 {
	char c1; //1个字节
	char c2; //1个字节
	int  i;	 //4个字节
int main() {
	struct S1 s1;
	struct S2 s2;
	printf("%d\n", sizeof(s1));   6
	printf("%d\n", sizeof(s2));   6

	

我们将#pragma  pack改成了 1就成了 结构体不存在内存对齐了 也就不会浪费空间了

 

位段 

什么是位段?

比如: 

struct A {
	int _a;
	int _b;
	int _c;
	int _d;

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

 

位段可以在我们的需求下很好的为我们节省空间!! 

 位段的内存分配

 举个例子

 

 位段的跨平台问题:

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

 

 

枚举

enum Day//星期
{
 Mon,
 Tues,
 Wed,
 Thur,
 Fri,
 Sat,
 Sun
};
enum Sex//性别
{
 MALE,
 FEMALE,
 SECRET
};
enum Color//颜色
{
 RED,
 GREEN,
 BLUE
};

这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。 例如: 

 

 

 

 枚举的优点

 联合体(公用体)

联合类型的定义    

联合体大小的计算

 

 

 以上就是小王同学给大家带来的结构体的进阶的一些相关知识 觉得写的不错的话

奉上大家的三连吧

举报

相关推荐

0 条评论