struct
struct结构体在分配内存时需要遵循内存对齐规则:
1. 结构体的起始存储位置必须是能够被该结构体中最大的数据类型所整除;
2. 前面单元的大小必须是后面单元大小的整数倍(每个数据成员存储的起始地址必须是自身大小的整数倍),如果不够就补齐;
3. 整个结构体的大小(即sizeof的结果)必须是最大数据类型的整数倍;
struct T{
char c;
int i;
long long l;
char ch;
};
T t = {'a',0,0,'b'};
T* p = &t;//0x28fee0
char* p_c = &t.c;//0x28fee0
int* p_i = &t.i;//0x28fee4
long long* p_l = &t.l;//0x28fee8
char* p_ch = &t.ch;//0x28fef0
printf("sizeof T:%d\n",sizeof(T));//24
union
union关键字的用法与struct类似,但其空间大小仅为最大长度的数据成员,即union中的所有成员变量共享相同的内存区域
大端模式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中
小端模式:字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中
通常linux中采用小端模式,即高字节存储在高地址中
union{
int32_t i;
struct{
int16_t l;
int16_t h;
}s;
}u;
u.i = 0x12345678;
printf("%x %x\n",u.p.l,u.p.h);//5678 1234