#pragma pack()改变结构中字节对齐方式

   在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()这个宏定义函数在结构体和联合体中的用处还是蛮大的,嘿嘿。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值