OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3400|回复: 11

struct结构的问题

[复制链接]

11

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-7-21
在线时间
11 小时
发表于 2015-9-16 08:44:41 | 显示全部楼层 |阅读模式
5金钱
我定义了一个结构如下:
struct frame_4byte_struct{ 
    u16 header;
    u8 control_area;
    u32 dev_addr;
    u8 data_len;
    u32 data_area;
    u8 cksum;
}frame_4byte;
用sizeof(frame_4byte)返回值是20,不过这个结构似乎只占用的13个字节,怎么做才能让sizeof(frame_4byte)返回值是13?

最佳答案

查看完整内容[请看2#楼]

#pregma pack(1)试试,1字节对齐
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2015-9-16 08:44:42 | 显示全部楼层
#pregma pack(1)试试,1字节对齐
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-9-16 08:55:47 | 显示全部楼层
先放置u8类型,然后u16,最后u32,后放置元素至少占用前一个元素同等字节数
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12130
金钱
12130
注册时间
2013-3-8
在线时间
1289 小时
发表于 2015-9-16 08:59:31 | 显示全部楼层
你这个数据不可能是13.
struct frame_4byte_struct{ 
   u8 data_len;
   u8 control_area;
   u16 header;
   u8 cksum;
   u32 dev_addr;  
   u32 data_area;  
}frame_4byte;
这样子排应该是最少的!也要16个字节
回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
发表于 2015-9-16 09:03:34 | 显示全部楼层
1楼正解,这个貌似涉及到对齐问题!
回复

使用道具 举报

11

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-7-21
在线时间
11 小时
 楼主| 发表于 2015-9-16 09:08:18 | 显示全部楼层
回复【2楼】龙之谷:
---------------------------------
这是一个帧的结构,位置调整了之后发送出去的帧的格式就不对了,但是不调整,这自动增加的字节也让帧的格式不对,真纠结...
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-9-16 09:15:19 | 显示全部楼层
回复【5楼】taishan519:
---------------------------------
不使用结构体而直接使用各个变量呢,可能稍麻烦点,但不用考虑字节问题了
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

11

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-7-21
在线时间
11 小时
 楼主| 发表于 2015-9-16 09:24:09 | 显示全部楼层
回复【6楼】龙之谷:
---------------------------------
因为我发送帧的时候,是发送一段连续内存中的数据出去,直接使用各个变量内存地址就不连续了
如果没有解决办法,只能创建一个数组一个一个字节去填了...
回复

使用道具 举报

86

主题

984

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-9-16 09:38:22 | 显示全部楼层
你这是结构体字节对齐哦,你这个结构体里面,最长的数据长度是U32类型,占用了4个字节,那就是4字节对齐,占用字节情况如下表示:
struct frame_4byte_struct{ 
    u16 header;         //2字节
    u8 control_area;    //2字节
    u32 dev_addr;       //4字节
    u8 data_len;        //4字节
    u32 data_area;      //4字节
    u8 cksum;           //4字节
}frame_4byte;

所以你用sizeof(frame_4byte)求得的返回值是20


可以做如下顺序调整:
struct frame_4byte_struct{ 
    u16 header;         //2字节
    u8 control_area;    //1字节
    u8 data_len;        //1字节
    u32 dev_addr;       //4字节
    u32 data_area;      //4字节
    u8 cksum;           //4字节
}frame_4byte;

所以你这时用sizeof(frame_4byte)求得的返回值是16,这是最小的占用字节数,如果你强制1字节对齐,存取速度就会变慢,不可取
合肥-文盲
回复

使用道具 举报

11

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-7-21
在线时间
11 小时
 楼主| 发表于 2015-9-16 09:47:11 | 显示全部楼层
回复【8楼】as564335sa:
---------------------------------
这个方法很好,正好解决了我的问题~
虽然这样存取速度可能会变慢,但是目前我的程序中这个结构体使用的频率并不高,所以没有大碍
结构体这样声明就可以了
#pragma pack (1)
struct frame_4byte_struct{ //数据域为4字节的帧结构
u16 header;
u8 control_area;
u32 dev_addr;
u8 data_len;
u32 data_area;
u8 cksum;
};
#pragma pack ()
extern struct frame_4byte_struct frame_4byte;
回复

使用道具 举报

22

主题

213

帖子

0

精华

高级会员

Rank: 4

积分
682
金钱
682
注册时间
2015-2-13
在线时间
74 小时
发表于 2015-9-16 09:52:40 | 显示全部楼层
[mw_shl_code=c,true]__packed struct frame_4byte_struct{ u8 data_len; u8 control_area; u16 header; u8 cksum; u32 dev_addr; u32 data_area; }frame_4byte;[/mw_shl_code]
试试这个。
回复

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2015-9-16 10:10:55 | 显示全部楼层
四字节对齐问题,最少也要16个字节
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-19 18:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表