嵌入式Linux C(十二)——复合数据类型
一、struct结构体
struct 定义结构体类型:
- 第一个字母大写;
- {}后面有
;
号 - 结构体名一定能体现结构体的作用(自注释性)
- 最好写在全局,或者写在头文件(结构体定义在函数内部,只能由该函数调用)
- 不可以保存函数,但是可以保存函数指针
- 用
.
或者->
访问结构体变量的成员 - 初始化(野指针问题、直接给数组名赋值(指针常量))
- 结构体之间的赋值:浅拷贝;—>深拷贝
浅拷贝(自己写)
释放两次
深拷贝?
//深拷贝
void copy_struct(struct student * s1, const struct Student *s2)
{
(*s1).num = (*s2).num;
(*s1).age = (*s2).num;
int len = strlen((*s2).num);
(*s1).name = (char *)malloc(sizeof(char) * len + 1);//+1为了'/0'
strcpy((*s1).name,(*s2).name);
}
struct Student
{
int num;
char name[30];
//char *name;
int age;
void (*fun)();
};
void print()
{
printf("hello world");
}
//初始化:
struct Student stu = {1,"zhangsan",12,printf};
struct Student stu2 = {.num = 1,.name = "zhangsan",.age = 12,.fun = print};
//定义结构体指针
struct Student *pstu = &stu;
struct Student stu2 = {
.num = 1,
.name = "zhangsan",
.age = 12,
.fun = print
};
printf("stu.num = %d\n",stu.num);
printf("stu.num = %d\n",(*pstu).num);//`()`一定加,优先的.高,所以加上括号
printf("stu.name = %d\n",(*pstu).name);
printf("stu.num = %d\n",pstu->num);//`->`前后不能有空格
printf("stu.num = %d\n",(&stu)->num);
struct Student stu3;
scanf("%d",&(stu.num));
//stu.name = (char *)malloc(sizeof(char) * 100);
//if(NULL == syu.name)
//{
// printf("malloc error!\n");
// exit(1);
//}
//scanf("%s",stu.name);
//stu.name = "zhangsan";//数组名不能赋值,是常量
strcpy(stu.name,zhangsan"")
scanf("%d"&(stu.age));
//free(stu.name);
struct Student stu4;
//stu4 = stu;
copy_struct(&stu4,&stu3)
free(stu3.name);
free(stu4.name);
1. 使用注意事项:
字对齐,导致的内存空洞,将相同类型放在一起
结构体的作用:封装数据(打包数据) — 抽象数据
字(4个字节)对其的方式(默认处理方式)(等于4个字节)
ch1 —> 4
num —> 4
ch2 —> 4
首先会为第一数据分配一个字,再看下一时,分析上一个剩余空间是否够用,不够用则新开辟空间
双字(8个字节)对其的方式(默认处理方式)(大于4个字节)
struct node
{
char ch1;
int num;
char ch2;
};
//特殊
struct node
{
char ch1;
short b;
char ch2;
int num;
};是12个字节
struct node
{
short b;
char ch1;
char ch2;
int num;
};是8个字节
#pragma pack(4) 4个字节对齐
#pragma pack() 恢复默认
2.struct数组
struct Student
{
int num;
char name[20];
int age;
}
typedef struct Student Stu;
int main
{
Stu AStu[3] = {
{
.num = 1,.name = "zhangsan",.age = 12
},
{
.num = 2,.name = "lisi",.age = 13
},
{
.num = 3,.name = "wangwu",.age = 14
}
};
for(int i = 0; i < sizeof(AStu) / sizeof(Stu); i++)
{
printf("num = %d, name = %s , age = %d\n",AStu[i].num,AStu[i].name,AStu[i].age);
}
}
3.柔性数组
struct node
{
int len;
int src[0];
};
typedef struct node Array;
int main()
{
printf("sizeof(node) = %d\n",sizeof(struct node));
Array a;
a.len = 100;
a.src = (char *)malloc(sizeof(char) * 100);
a.src = (char *)realloc(sizeof(char) * 原有字节长度);
}
4.作业???
封装函数
二、union共用体
union定义类型,定义变量和指针、初始化
struct VS union:大小
union大小:保存的成员中最大字节长度的成员所决定:(保持字对齐)
存储方式:所有成员公用一段内存空间(最长字节数的变量)(数据覆盖)
- CPU属性:大端字节序、小端字节序
- 利用共用体判断CPU的大小端字节序
多选一
三、enum枚举
enum:定义一系列整数宏
枚举变量 == 整型变量
enum VS #define
enum:定义一些列整数宏更加便捷,在编译阶段
#define :预处理,不安全,做傻瓜式替换
enum Result
{
OK,
NO,
SUCCESS,
FAILED
};
#define OK 0
#define NO 1
#define SUCCESS 2
#define FAILED 3