遵守两个原则
1.为结构体变量的成员变量分配内存的起始地址必须为成员变量内存长度的整数倍。
2.结构体变量内存的总大小必须为sizeof(结构体成员变量)(最大的)的整数倍。
struct Demo{
char a;//sizeof(char)=1
int b;//sizeof(int)=4
flloat c;//sizeof(float)=4
double d;//sizeof(double)=8
};
struct Demo demo;
sizeof(demo)=24;
- 假设从0开始为结构体变量分配内存
- 0:分配给demo.a;
- 4-7:分配给demo.b,根据原则一,分配起始地址必须为成员变量内存长度的整数倍,1不是4的整数倍,所以从4开始分配;
- 8-11:分配给demo.c;
- 16-23:分配给deom.d,根据原则一分配起始地址必须为成员变量内存长度的整数倍,必须为8的整数倍,12不是8的整数倍,必须从16开始,同时满足原则二,成员变量占内存最长为8,24为8的整数倍,所以该结构体分配内存24;
struct Demo{
char a[6];//sizeof(char)=1
double b;//sizeof(double)=8
int c;//sizeof(int)=4
};
struct Demo demo;
sizeof(demo)=24
- 假设从0开始为结构体变量分配内存
- 0-5:分配给demo.a;
- 8-15:分配给demo.b(根据原则一);
- 16-19:分配给demo.c(根据原则一);
- 20-23:补全为8的倍数(根据原则二)。
struct Demo{
char a[6];
}demo;
sizeof(demo)=6;
struct Demo{
char a[6];
struct Demo *next;
}demo;
sizeof(demo)=16;(64位计算机)
指针变量的功能是存储变量的地址,所以在定义执政变量的时候会为指针变量分配一定的内存(16位:2,,32位:4,64位:8),而且这个内存的大小与指向的变量的类型无关,并不是指向double类型就分配8,指向int类型为4,而是即使指向的char类型,分配的也是8(64位),因为指针变量里面存储的只是地址