在32位编译环境中 sizeof的用法
sizeof(char) 1
sizeof (int) 4
sizeof(unsigned int) 4
sizeof(long int) 4
sizeof(short int) 2
sizeof(float) 4
sizeof(double) 8
2.指针变量的sizeof
char *pc="abc";
sizeof(pc) 4
sizeof(*pc) 1
int *pi
sizeof(pi) 4
sizeof(*pi) 4
char **ppc=&pc;
sizeof(ppc); 4
sizeof(*ppc) 4
sizeof(**ppc) 1
void(*pf)() sizof(pf) 4;
4数组的sizeof
char a1[]="abc";
int a2[3];
sizeof(a1)//结构为4 ,还有一个结束符
sizeof(a2)//结果为12;
结构体的sizeof
struct MyStruct
{
double dda1; 8
char dda; 1
int type; 4
};
结果为16, 存储变量时地址要求对齐,需遵循两条原则:
1.结构体变量中成员的偏移量必须是成员大小的整数倍
2.结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数。
该成员变量占用sizeof(double)=8,接下来为第二个成员dda分配空间,这时下一个可以分配的地址对应结构的起始地址的偏移量为8
是sizeof(char)的整数倍,sizeof(int)=4;
struct MyStruct
{
double dda1;
char dda ;
}
运行结果16;
含有联合的结构体的sizeof
struct s1
{
char *ptr,ch; //有指针变成4+4
union A
{
short a,b;
unsigned int c:2,d:1;
};
struct s1*next; //指针占4
}
这样运行结果是8+4=12
typedef Mystruct{
uint8_t i;
uint8_t num[10];
}
运行结果是11
typedef Mystruct{
uint8_t i;
uint8 _t *p;
uint8_t num[10];
}
sizeof(MYstruct)运行结果 20
typdef Mystruct{
uint8_t i;
uint8_t *p;
uint8_t num[10];
}
typedef struct{
Mystruct *p1; //4
double a; //8
uint32_t b; //4
uint8_t c; //1
}length
sizeof(length)运行结果是24
typedef struct{
Mystruct p1; //20
double a; //8
uint32_t b; //4
uint8_t c; // 1
}length;
sizeof(length)运行结果40;