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.