OpenEdv-开源电子网

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

关于公用体数据结构的问题

[复制链接]

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
发表于 2016-8-18 23:04:27 | 显示全部楼层 |阅读模式
1金钱
之前很少用到公用体,最近用到了,但是调试过程中发现的一个问题,有点想不通。
假设我定义一个结构
struct{
         uint8 a;
         uint8 b;
         union{
                uint8 data[256];
                struct{
                        uint8 c;
                        uint8 d;
                        uint8 e;
                        uint8 f;
                        uint8 *g;
                }
         }
       uint8 h;
       uint8 i;
};
问题是我对这个结构体里面的成员取地址观察了一下。
假设a地址为0.
a 0
b 1
c 4
d 5
发现c的地址怎么就会变成4呢,按道理应该也是加1递增的把。
这个结构体sizeof 大小的确是对的,是264.

最佳答案

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

在32位的MCU上,4字节对齐访问是比较高效的,如果没有特别指出数据结构对齐的方式,默认是按4字节对齐的,a,b之后是一个结构体,这个时候就会跳到下一个4字节对齐的位置,就是4的位置,所以c在位置4,所以整个结构体是size是264而不是260; 如果想让c在位置2,可以在结构体前后加上 #pragma pack(push) //保存对齐状态 #pragma pack(1)//设定为1字节对齐 struct test { ....... }; #pragma pack(pop)//恢复对齐状态
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-8-18 23:04:28 | 显示全部楼层
在32位的MCU上,4字节对齐访问是比较高效的,如果没有特别指出数据结构对齐的方式,默认是按4字节对齐的,a,b之后是一个结构体,这个时候就会跳到下一个4字节对齐的位置,就是4的位置,所以c在位置4,所以整个结构体是size是264而不是260;

如果想让c在位置2,可以在结构体前后加上


#pragma pack(push) //保存对齐状态
#pragma pack(1)//设定为1字节对齐
struct test
{
.......
};
#pragma pack(pop)//恢复对齐状态
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2016-8-18 23:08:32 | 显示全部楼层
按正常来说,a-f地址是依次加1递增的,到指针的时候加4,然后就还是依次加1递增的。
但是实际数据结构明显不是我想的这么。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-6 20:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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