#pragma pack 的使用场景

    除了在学习 C 语言结构体字节对齐时,做练习题的时候碰到过,在几年的工作中,一直没有找到 #pragma pack 的使用场景。最近实现一套 C/S 系统的内部通信,在读取网络数据时,碰到了字节对齐引起的问题。具体如下:

    Server 用 Java 实现,发送数据是采用 WriteInt、WriteShort 等方式,并没有考虑字节对齐的问题(Java 也的确无需考虑)。我的最初设计是,定义一个对应的结构体指针,然后分别读取结构体中的各个字段,但是发现得到的数据不对。经过仔细比对,发现原因是数据错位。仔细思考才想到,是字节对齐引起的。

    定义的结构体如下:

        typedef struct tagTEST {

            uint32_t  i;

            uint16_t  j;

            uint32_t  k;

            ......

        }TEST_S;

    使用该指针指向网络数据包时,i 和 j 是对的,但是从 k 以后就开始错位。原因就是系统默认按照 4 字节对齐(这个说法不全对,如果是 uint32_t 和 uint64_t 在一起,uint32_t 后也会空余 4 字节),所以 j 和 k 之间有 2 个字节的填充。此时指向数据包,自然就发现错位了。解决办法也很简单,使用 #pragma pack 强制按照你所需要的字节对齐即可。

    后来想到,linux 中的 ip.h、tcp.h 也应该指定强制 1 字节对齐,但是看了源码,并没有使用 #pragma。why?

    #pragma 更多的参数请百度之。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值