更新时间:2016-08-22 14:23:14浏览次数:1+次
struct protocol
{
char a;
char[2] len;
char[4] value;
char[8] bigvalue;
};
当然,这样的定义没有错。然而本来一个数值的成员,可以直接进行数学运算的,都char数组表示,那使用起来还不累死。另外说明一点,如果要确切的定义每一个成员的长度,不仅要让每一成员的字节长度固定,而且内存对齐也要做好。如果字段的长度有奇数有偶数之类的,要让内存按照1字节对齐,这样你定义的时候就随便定义。如果你的结构成员都是2的整数倍个字节的话,可以按照2字节来对齐。内存对齐产生的问题就是,如果结构成员字节数不是整倍数,会对齐到整倍数,这样就让成员的字节数增加了,和协议上定义的准确的字节数不一样的,也就产生错误。常见的就是错位,严重的就完全错乱。在通信的时候,严格按照协议上的字节数来传输,接收到的数据存入不正确的结构体中,数据就乱了。#pragma pack (push,1)//按1字节对齐结构体
struct protocol
{
char a;
char[2] len;
char[4] value;
char[8] bigvalue;
};
#pragma pack(pop)
这样,结构体成员定义多少字节就是多少字节,不会再编译器对齐产生字节变多的情况了。结构体内存对齐更多参考《关于结构体内存分配对齐深入理解》、《结构体对齐问题分析》、《关于成员对齐方式》。#include <stdio.h>
int main()
{
int len_short = sizeof(short);
int len_int = sizeof(int);
int len_long = sizeof(long);
int len_longlong = sizeof(long long);
printf("short=%d\nint=%d,\nlong=%d,\nlong long=%d\n",len_short,len_int,len_long,len_longlong);
}
运行截图如下:struct protocol
{
char a;
short len;
int value;
long long bigvalue;
};
这样定义后,我们可以直接取到结构体中的成员,然后进行数值运算,比char数组方便多了。不过,我们这个代码如果放在64位环境中,则会出问题,因为64位系统的这几个整型类型的字节长度和32位系统的不一样。如果不考虑64位系统,是没有问题。typedef char byte_1;
typedef short byte_2;
typedef int byte_4;
typedef long long byte_8;
然后结构体重新定义一下:struct protocol
{
byte_1 a;
byte_2 len;
byte_4 value;
byte_8 bigvalue;
};
这样定义之后,你可以一目了然,从类型就可以看出每一个字段的字节数。这样在检查和调试的时候非常方便了。这个做法是非常普遍的。如果你连这个做法都不理解,只能说明你经验不足。有很多人会抱怨,为什么老是要定义一些新类型名字,原因就是这了。相关资讯