目录
1
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 = 1;
pstPimData->ucData1 = 2;
pstPimData->ucucData2 = 3;
printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]);
return 0;
}
输出02 29 00 00。puc分成四个部分,每一个都占据一个字节,现在把它的首元素地址强制转换为结构体类型,然后给了pstPimData,所以pstPimData就指向了puc的首元素,借助此就可以访问整个数组。现在存放结构体变量,Pim1占据puc[0],而puc[1]里,Data0占1个比特位,Data1占2个,Data2占3个。之后改变数值,puc[0]存放的就是00000010,而puc[1]里,假设是小端存储,data0是01,只有一个比特位,所以留1;data1是10,有2个比特位,所以留10;data2是101,有3个比特位,所以留101,所以puc[1]整体就是001011001,也就是29,puc[2] puc[1]都为0,所以最终结果就是02 29 00 00。
2
#include <stdio.h>
int main()
{
union
{
short k;
char i[2];
}*s, a;
s = &a;
s->i[0] = 0x39;
s->i[1] = 0x38;
printf("%x\n", a, k);
return 0;
}
a是这个联合体的名,s指针指向它,把a的地址放到s里,联合体共用一块内存,所以整个联合体就是2个字节。如果是小端存储,打印出来就是3839。
3
malloc不可以向内存申请0字节的空间,这样会返回正常的地址,但是却不能使用。malloc开辟完后也必须释放内存。free也可释放NULL指针。
结束。