在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。
以下结构体为例说明:
typedef struct sys_data0
{
unsigned char databag_type;//1
int EPC[4]; //16
unsigned char segment_num;//1
unsigned char last_segment;//1
short data_length;//2
unsigned char user_data[netDATASIZE];//26
}net_data;
union xx
{
unsigned char buff[52];
net_data net_opma;
}tt;
在没有进行#pragma pack(1)宏定义时,当给tt.net_opma中各个成员赋值时,
tt.net_opma.databag_type=0x10;//84
tt.net_opma.EPC[1]=0x98765432;
tt.net_opma.EPC[2]=0x11223344;
tt.net_opma.EPC[3]=0x55667788;
tt.buff[0]=0x10;
tt.buff[1]=0;
tt.buff[2]=0;
tt.buff[3]=0;
tt.buff[4]=0x32;
tt.buff[5]=0x54;
tt.buff[6]=0x76;
tt.buff[6]=0x98;
```````````````
可以看到第一个字节后面多出了3个字节,这是由于arm上默认的是4字节对齐的,第一个是char型,占用一个字节,第二个是int型占4个字节,内存中摆放如下:
00 00 00 0x10
0x98 0x76 0x54 0x32
··········
若采用了#pragma pack(1)后在内存中摆放如下,这样就不会多出空着的3个字节了:
0x76 0x54 0x32 0x10
······· 0x98
#pragma pack()这个宏定义函数在结构体和联合体中的用处还是蛮大的,嘿嘿。。