1.c语言结构体是一种自定义的数据类型,这种数据类型比较复杂,它是由一些基本的数据类型组成,比如int,float,char等。在处理一些实际问题时,比如一个学生的基本信息,就会使用结构体来储存学生的一些基本信息,比如姓名,年龄,班级等,很显然,这些数据都是不同的数据类型,结构体就是把不同种的数据类型结合在了一起。
2.下面是定义一个简单的结构体
#include<stdio.h>
#include<windows.h>
struct student
{
char name[10];
int num;
int age;
char class[10];
}stu;
结构体的赋值
stuname = "Tom";
stu.num = 12;
stu.age = 18;
stu.class = 'A';
3.关于结构体中内存分配问题
编译器在为结构体分配内存时,是按照这个结构体中占用内存字节数最大的那个变量的字节数来依次分配的,然后在这块内存中按照结构体变量中的声明顺序来依次分配空间,如果发现当前的空间不足以分配给新的变量,那么会申请新的依旧是这个数量级的内存来进行分配,而之前的会被默认的填充。
如下图:
typedef struct
{
float a ;
char b;
int c;
double d;
int *pa;
char *pc;
short e;
}A;
double d;是所有这些里面占有内存字节数最大的,是8,所以编译器先分配一个8B的空间。
a占用(4B) + b占用(1B) 还剩3B不够分配给c,所以剩下的3B不做分配,空闲(3B),
再申请8B,c占用(4) + 空闲(4)
再申请8B,d占用(8)
在申请8B, pa(4) + pc(4)
在申请8B, e(2) + 空闲(6)
所以我们可以看到,总共申请了5次, 8B的空间,即这个结构体的大小为40B。
在默认情况下,规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。
编译器也提供给我们自己的方法来进行字节的对齐,通过使用#pragma pack(n)来设定变量以n字节对齐方式。如果以n字节为对齐方式会有出现两种情况:
一、如果n大于等于该变量所占用的字节数,那么偏移量就使用默认的对齐方式即sizeof()的整数倍。
二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。