4611|16

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

再问几个关于数据对齐的问题,谢谢!! [复制链接]

还是数据对齐的问题。

ARM7 44B0,ADS下裸机调试。

问题一:我对代码中用到的一个结构体sizeof,发现其size为146,146并不能被4整除,为什么不自动在结构体的末尾自动补两位,148能被4整除。(这个结构体的成员都是8位或者16位的)
是不是所有的结构体的size都应该被4整除?

问题二:
代码中还有这样一个结构体,如下,注释里标的是相应的地址。
typedef struct {
    UINT8 a;            //0x0C016108
    UINT8 b;            
    UINT8 c;
    UINT8 d;
    UINT8 e;
    UINT8 f;
    UINT8 g;           //0x0C01610E
    A     *p;          // 0x0C016204  
} B;
其中A也是一个结构体。
这里指针p的地址为什么不是0x0C016200,而是204,00-03这四个字节的空间被拿来做什么了?

问题3:怎样才算是被4整除的地址?只有以0,4,8,C结尾的地址吗?

帮帮忙,谢谢!

最新回复

谢谢大家的回答,基本上算是弄明白了。  详情 回复 发表于 2009-3-31 14:40
点赞 关注

回复
举报
他妈的天使 该用户已被删除
沙发
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
1.即使编译选项是4字节对齐,sizeof 的值并不一定能被4整除,只能保证占用空间大于等于4的,是以能被4整除的地址开始;
2。0x0C016204  这个值是怎么看出来的,p的地址我觉得应该是&g + 2,0x0C01610E + 2 = 0x0C016120
3.被4整除就不需要解释了吧
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
不好意思,写错了
问题二:
代码中还有这样一个结构体,如下,注释里标的是相应的地址。
typedef struct {
    UINT8 a;            //0x0C016108
    UINT8 b;            
    UINT8 c;
    UINT8 d;
    UINT8 e;
    UINT8 f;
    UINT8 g;          //0x0C01610E
    A    *p;          // 0x0C016114  
} B;
其中A也是一个结构体。
这里指针p的地址为什么不是0x0C016110,而是114,10-13这四个字节的空间被拿来做什么了?

ADS把鼠标放在指针型变量上,观察到的地址。
WATCH观察到的也是这个值。

奶奶的,我这里上eeworld太卡了,刷个页面20几分钟。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
你打印一下

B b;

&b.a
&b.g
&b.p

看看
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

6
 
还有你的系统是BigEndian还是LittleEndian
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

7
 
把A的结构体也写出来啊,B结构体是按B中字长最长的变量的字节数来作为对齐字节,除非你有字长限制。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 
没用过ADS。你的编译选项中默认对齐方式是什么?在struct B定义的前面有没有用了pragma编译指示强制设定对齐方式?只有搞清楚了对齐方式,才能知道他的内存布局。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 llKK0616 的回复:
把A的结构体也写出来啊,B结构体是按B中字长最长的变量的字节数来作为对齐字节,除非你有字长限制。


和A没关系呀
那只是个指针
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 4 楼 ultrapro 的回复:
你打印一下

B b;

&b.a
&b.g
&b.p

看看


打印的话
&b.a   //0x0C016108  
&b.g   //0x0C01610E
&b.p   //0x0C016110

跟分析的结果是一样的。
奇怪了。
在struct B定义的前面没有用pragma编译指示强制设定对齐方式。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

11
 
sizeof(B ) = ?
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 3 楼 duoduozb 的回复:
这里指针p的地址为什么不是0x0C016110,而是114,10-13这四个字节的空间被拿来做什么了?


你的结构体指针指向哪里了?

 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

13
 
&b.a  //0x0C016108  
&b.g  //0x0C01610E
&b.p  //0x0C016110

如果是这个值就没有什么问题呀?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(中级)

14
 
sizeof(B )=12

打印出来的确是这样的
&b.a  //0x0C016108  
&b.g  //0x0C01610E
&b.p  //0x0C016110



 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

15
 
关于嵌入式内存对齐的问题,是个很棘手的问题,我以前也遇到过,慢慢弄,不是一两句话说的明白的
www.01zg.com,将嵌入式进行到底!
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

16
 
你试试这个:
#ifdef _MSC_VER
#pragma pack(push,4)
#endif
typedef struct {
    UINT8 a;            //0x0C016108
    UINT8 b;            
    UINT8 c;
    UINT8 d;
    UINT8 e;
    UINT8 f;
    UINT8 g;          //0x0C01610E
    A    *p;          // 0x0C016204  
} B;
#ifdef _MSC_VER
#pragma pack(pop)
#endif
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

17
 
谢谢大家的回答,基本上算是弄明白了。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表