首先定义一个结构体初始化并且算大小:
struct qq
{
int w;
double r;
}s1;
struct stu
{
char name[10];
int a;
float b;
struct qq s;
}s2;
//struct qq s1={2,2.000000};
struct stu s2={"张三",4,2.255555,{2.2,2.000000}};
int main()
{
printf("%d",sizeof(s2)); //结构体内存对齐
}
了解这段起码,结构体的初始部分就了解了,接下来就是结构体自引用,结构体内存对齐的知识点
结构体自引用我们还是用一段代码来理解
struct pp
{
int data;//--->四个字节
struct pp n; // 如果这样自引用,导致无线套娃,大小不可确定
};
// 我们的目的其实是想通过自引用找到下一节点,通过变量会导致不可确定性的错误
struct pp
{
int data;
struct pp* next; // --->通过指针便可找到下一节点,而且指针大小是确定的4/8
};
结构体内存对齐是很重要的。也是难点!!
内存对齐的规则通俗点:1.不管第一个数据是什么都要与起始位置偏移量位0
2.往后的数据的准则:是他本身字节大小与系统默认的对齐数(vs默认8)的较小值的最小整数倍的偏移量
3.结构体总大小准则:字节总大小=结构体中的数据的最大对齐数的整数倍
4.如果结构体中嵌套着一个结构体:嵌套的结构体对齐数为该结构体最大对齐数
用文字可能难以理解用代码来写出来:
#pragma pack(2) //表示2字节对齐
struct pp //以下的文字更易理解
{
char a; // char占第一位,不管你是什么数据类型,都从第一位开始
int b; // 4(int 字节大小)与2(设置的字节对齐)-->2小-->2对齐 第二位浪费从3开始存放
double c; // 8与2--->2 从⑦开始放+8 --->14?---->易错--->16 还有结构体总大小的准则
};
struct ppp
{
int a;
struct pp s; //---->大小是:24--->4 嵌套准则 到 8 +16--->24(结构体总大小准则)
};
位段:
struct oo
{
int a:5;
int b:5;
}; 小端很像
枚举:
enum Mac
{
Male; //--->默认位0
Kiu;---->1
Juu=5;--->5
Hyt;----->6
} ;
联合体:
union aa
{
char a;
int b; 4
char d[5];------> 最大成员大小不是最大对齐数的整数倍 大小:8
}