2021-06-17嵌入式学习杂记 ---结构体

1、结构体定义 struct + 关键字

struct Student
{
	int score;
	char name[128];
}; //新手忘带上右大括号后的;

结构体使用:struct Student stu1 = {98, "康先森"};
访问结构体:printf("结构体:score = %d\n", stu1.score);
2、注意野指针

char *p;
p = (char *) malloc (128); //开辟空间
memset(p, '\0', 128);      //初始化

3、结构体指针

struct Student *p; //野指针
p = (struct Student *)malloc(sizeof(struct Student));
p->score = 98;//如果用结构体指针,就不能用点运算访问结构体变量,要用->
strcpy(p->name,"李四");//字符串拷贝
printf("名字:%s, 分数:%d\n", p->name,p->score);

4、计算结构体大小
由于存储变量地址对齐的问题,结构体大小计算必须满足两条原则:
一、结构体成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
二、结构体大小必须是所有成员大小的整数倍(不考虑数组和结构体)
**注意:**对齐方式很浪费空间,但是按照计算机的访问规则,对齐方式提升了效率。
1、简单结构体

struct s1{
	char ch1;//大小为1
	char ch2;//大小为1
	int i;//大小为4, 1+1+4=6  而是1+1+2+4
};//但是总的结构体大小为8,要遵循规则一,偏移量是成员大小的整数倍
struct s2{
	char ch1;//1
	int i;//4  偏移量1+2+4
	char ch2;//1  1+2+4+1
};//总的结构体大小为12,遵循规则二,结构体大小是所有成员大小的整数倍

这个结构体大小是12,为什么呢?仔细看看两个原则,要满足偏移量是成员的整数倍,ch1偏移量是0,i的偏移量不可能是1,因为1不是i大小4的倍数,所以i的偏移量是4,ch2的偏移量就变为了8,所以满足结构体大小是成员大小整数倍,就是12。
2、成员包含数组的结构体

struct s3{
	char ch;//1
	int i;//1+2+4
	char str[12];//12   24?
};

这个结构体的大小是20,先看前两个成员,大小是8,毋庸置疑,这个char类型的数组,只需要把它看做十二个char连在一起即可,加起来就是20,再满足结构体大小为成员整数倍,所以大小就是24,但是数组不考虑,所以20就可以是除了数组以外成员的大小的整数倍。
3、成员包含结构体的结构体

struct s4{
	char ch;//1
	int i;//4+3
	struct s{
		char ch1;
		int j;
	};  //包含的结构体只是声明,不占内存,并没有命名,不计算大小
	float f;//4
};//但是结构体大小是12

结构体大小是12,里面包含的结构体不占空间,不考虑

struct s4{
	char ch;//1
	int i;//4+3
	struct s{         //里面这个结构体的大小是8
		char ch1;//1
		int j;//4+3
	}stmp; 
	float f;//4
};//结构体大小是20

所以计算结构体大小时是把里面这个结构体就看做是一个char,和一个int,不是看做一个整体,里面这个结构体的大小是8。结构体的大小是20,结构体大小不需要向8对齐。如果内部嵌套结构体有double占8个字节,就需要向8看齐,此时结构体大小是32

上面两个内部结构体嵌套区别是,包含的结构体有没有命名stmp。结构体的大小就会发生变化

4、成员包含联合体的结构体

struct s5{
	char ch;//1
	int i;//3+4
	union{
		char ch1;//1
		int j;//**4**
	};
};

联合体大小就是成员中最大类型的大小,所以这个结构体大小是12.
5、指定对齐值
(1)对齐值小于最大类型成员值

#pragma pack(4)  //指定向4对齐 最大是8
struct s6{
	char ch;
	int i;
	float f;
	double d;
};

如果我们没有指定对齐值,这个结构体大小是24,我们指定向4对齐,所以大小是4的倍数,所以结构体大小是20。
2)对齐值大于最大类型成员值`

#pragma pack(10)
struct s7{
	char ch;
	int i;
	float f;
	double d;
};

我们指定的对齐值是10,最大为8,是否就向10对齐?不是,当指定对齐值大于自身对齐值时,向自身对其值对齐,结构体内的各个元素大小都没有超过10,最大的才是8,所以对齐方式还是按照最大的8对齐,结构体大小是24.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值