硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4743|回复: 3
收起左侧

[有问必答] 在结构体定义的时候为什么需要#pragma pack(push)

[复制链接]

17

主题

32

回帖

83

积分

初级会员

积分
83
发表于 2021-1-8 16:08:32 | 显示全部楼层 |阅读模式
在结构体使用时有时会发现结构体变量的值会被改变。
但是在结构体定义的时候,使用如下字节对齐的方式便会解决此问题,请硬汉看一下。
#pragma pack(push) //保存对齐状态
#pragma pack(1)//设定为1字节对齐

typedef struct
{
    u8  ctl_byte;   
    u16 msg_lenth;  
    u8  pkg_cnt;  
    u8  not_use;  
    u8  pgn[3];
} TP_def;
#pragma pack(pop)
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2021-1-8 16:48:58 | 显示全部楼层
用 __packed就可以了
但要小心, 确保位置不变后就有机会因对齐的问题而产生异常, 比如直接读写msg_lenth就很可能会发生异常
回复

使用道具 举报

17

主题

32

回帖

83

积分

初级会员

积分
83
 楼主| 发表于 2021-1-8 17:14:04 | 显示全部楼层
Edmund1964 发表于 2021-1-8 16:48
用 __packed就可以了
但要小心, 确保位置不变后就有机会因对齐的问题而产生异常, 比如直接读写msg_lenth ...

请教一下 是在结构体定义的时候把__packed当作固定的模式,还是程序有什么问题,把内存中的变量值意外修改了呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2021-1-9 08:09:56 | 显示全部楼层
这个问题之前还专门整理过一次,此贴。MDK的话,就用__packed即可

结构体变量占用多少字节问题
http://www.armbbs.cn/forum.php?m ... 9103&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-10 02:03 , Processed in 0.151699 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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