打印
[ZLG-ARM]

请教一个老问题:关于sizeof准确计算结构长度

[复制链接]
1936|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lw2008|  楼主 | 2007-7-5 10:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
struct sFrz_Adr_Tbl9  
{
   uint8 Buf[11];
   struct 
   {
      uint8  b;
      uint16 c;
    }sTbl2;
    uint8 uChkSum;   // 校验和
};

sizeof(sAdrTbl9)为18字节,实际为15

--------------------------------------------------
struct sFrz_Adr_Tbl9
{
    uint8 Buf[12];
    struct 
    {
        uint8  b[2];
        uint16 c;
    }sTbl2;
    uint8 uChkSum[2];   // 校验和
};

sizeof(sAdrTbl9)为18字节,实际为18

--------------------------------------------------
好像字节要偶数地址对准,这对于修改中的大型结构体来说人工校准量太大了,也易出错。
ADS中选的小端对齐,LPC2138。

相关帖子

沙发
lw2008|  楼主 | 2007-7-5 10:48 | 只看该作者

简化了一下

struct sFrz_Adr_Tbl7   // sizeof为7,实为7
{
    uint8 Buf[5]; 
    uint8 uChkSum[2];
};

struct sFrz_Adr_Tbl8   // sizeof为8,实为7
{
    uint8 Buf[5]; 
    uint16 uChkSum;
};

struct sFrz_Adr_Tbl9   // sizeof为8,实为5
{
    uint8 Buf[1];  
    uint32 uChkSum;
};

只要有非uint8加入结构,就会出现该问题。

使用特权

评论回复
板凳
alin_99| | 2007-7-5 10:53 | 只看该作者

注意 要 凑4的整数倍,合理安排存储顺序啊

使用特权

评论回复
地板
ayb_ice| | 2007-7-5 13:17 | 只看该作者

这和CPU有关,不会错的...

使用特权

评论回复
5
lenglx| | 2007-7-5 14:06 | 只看该作者

#pragma pack(1)
....
#pragma pack()

使用特权

评论回复
6
ayb_ice| | 2007-7-5 15:16 | 只看该作者

随便说说

有些编译器会插入补丁,以便对齐,实际是和内核有关,因为有些内核只能访问
对齐的地址...

使用特权

评论回复
7
lw2008|  楼主 | 2007-7-6 18:31 | 只看该作者

TO:lenglx


这是标准编译命令吧。

#pragma pack(1)
....
#pragma pack()

使用特权

评论回复
8
cszhaoqm| | 2007-7-7 00:51 | 只看该作者

搜索一下"字节对齐",对理解这个问题有帮助!

使用特权

评论回复
9
veryfatman| | 2007-8-2 08:59 | 只看该作者

vc

试验了一下,在vc里,struct member alignment规定的是最大对齐字节数。

和不同的数据类型有关。

例如设置alignment为4,则double按4字节对齐,char仍按2字节对齐。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

296

帖子

0

粉丝