int main()
{
unsigned char puc[4];
struct tagPIM
{
unsigned char ucPim1;
unsigned char ucData0 : 1;
unsigned char ucData1 : 2;
unsigned char ucData2 : 3;
}*pstPimData;
pstPimData = (struct tagPIM*)puc;
memset(puc, 0, 4);
pstPimData->ucPim1 = 2;
pstPimData->ucData0 = 3;
pstPimData->ucData1 = 4;
pstPimData->ucData2 = 5;
printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]);
return 0;
}
题目是:打印的结果是什么?
解析:
首先定义了一个类型为 unsigned char 的数组 puc,在下面用 memset 函数初始化为 0:
又定义了结构体 tagPIM 和指向这种结构体的指针 pstPimData ,将 puc 强制转化为 struct tagPIM* 类型后赋值给 pstPimData :
puc 和 pstPimData 指向同一个地址,但 puc 认为它指向的是一个数组,pstPimData 认为它指向的是一个结构体,经过下面四步赋值操作后的结果:
需要注意的是位段成员的存储空间是从右到左的(VS 环境下),用 %02x (十六进制)打印 puc 数组元素,puc 认为它指向的是一个类型为 unsigned char 的数组,所以 puc[0] 就是 00000010,puc[1] 就是 00101001,所以最终打印的结果就是 02 29 00 00。