struct可以将各种基础的数据类型结合到一起。里面最重要的是它的大小。
typedef struct tagStudent
{
int index;
char no[20];
char name[5];
}student;
int main()
{
size_t len = sizeof(student);
return 0;
}
从字面上看它的大小为29,实则不然,如果它的大小不能整除4,就会进行数据对齐,将其补全为4的整数倍,所以为32。这个在进行网络编程中计算数据大小时会很重要
对于空结构体,在不同的编译器中大小也不同,有的位0 ,有的为1,在vs2015中空结构体已经不能编译通过了。
结构体的一个使用场景:柔性数组
柔性数组的使用可以帮我们自定义数组的长度,这样就可以不用为太小装不下,太大浪费空间烦恼
typedef struct tagSoftArray
{
int len;
int arr[];
}softArray;
int main()
{
int len;
printf("请输入数组大小\n");
scanf_s("%d", &len);
softArray *sa = malloc(sizeof(softArray) + sizeof(int)*len);
free(sa);
return 0;
}
此时arr的大小即为len*sizeof(int).
在union中,它的空间是共享的,而且只分配最大数据类型的空间,如定义一个int和一个char的变量,它的空间为4,即为一个int类型所占的空间。使用它可以来判断大小端
大端是指数据的高位保存在内存的低地址中,而数据的低位,保存在内存的高地址中
小端是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中
typedef union Demo
{
char c;
int num;
}Demo;
int main()
{
Demo d;
d.num = 1;
printf("%d", d.c);
}
其中c的地址空间为num地址中地址最低的一个字节空间,如果此时d.c==1,则为小端机,否则为大端机。目前我们所使用的电脑基本都是小端机。