在结构体的实际使用中,可能会用到带冒号的单元分配使用,其占的空间是有变化的,打个比方,如下。
typedef unsigned char U8;
typedef struct
{
U8 B0:1;
U8 B1:1;
U8 B2:1;
U8 B3:1;
U8 B4:1;
U8 B5:1;
U8 B6:1;
U8 B7:1;
}StructCode1;
typedef struct
{
U8 B0;
U8 B1;
U8 B2;
U8 B3;
U8 B4;
U8 B5;
U8 B6;
U8 B7;
}StructCode2;
int main(int argc, char* argv[])
{
StructCode1 ss;
StructCode2 tt;
U8 st=sizeof(ss)/sizeof(U8);
U8 ts=sizeof(tt)/sizeof(U8);
printf("data is %d,%d/n",st,ts);
return 0;
}
输出结果是1,8。也就是说前者是按位分配了空间,后者是正常分配。
那么对应的,这种位数据成员在实际使用赋值时,也有其特殊的地方。如下例:
Typedef struct
{
unsigned char a:2;
unsigned char b:4;
unsigned char c:2;
}dataS;
int _tmain()
{
dataS tt;
memset(&tt,0xaa,sizeof(dataS)); //注意此时memset的设定长度只能是分配给tt的栈长度,大于就会报错
printf("%d %d %d",tt.a,tt.b,tt.c);
}
输出2 10 2。为什么呢?因为写入的0xaa二进制是10101010,分别赋给abc对应的位。然后取出每个作为一个单独的数值,即10,1010,10,得到输出结果。