再问几个关于数据对齐的问题,谢谢!!

ilycjf   2009-3-6 10:14 楼主
还是数据对齐的问题。

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结尾的地址吗?

帮帮忙,谢谢!

回复评论 (16)

沙发 他妈的天使 该用户已被删除

提示: 作者被禁止或删除 内容自动屏蔽
点赞  2009-3-6 10:25
1.即使编译选项是4字节对齐,sizeof 的值并不一定能被4整除,只能保证占用空间大于等于4的,是以能被4整除的地址开始;
2。0x0C016204  这个值是怎么看出来的,p的地址我觉得应该是&g + 2,0x0C01610E + 2 = 0x0C016120
3.被4整除就不需要解释了吧
点赞  2009-3-6 10:43
不好意思,写错了
问题二:
代码中还有这样一个结构体,如下,注释里标的是相应的地址。
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几分钟。
点赞  2009-3-6 10:51
你打印一下

B b;

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

看看
点赞  2009-3-6 10:57
还有你的系统是BigEndian还是LittleEndian
点赞  2009-3-6 11:00
把A的结构体也写出来啊,B结构体是按B中字长最长的变量的字节数来作为对齐字节,除非你有字长限制。
点赞  2009-3-6 12:18
没用过ADS。你的编译选项中默认对齐方式是什么?在struct B定义的前面有没有用了pragma编译指示强制设定对齐方式?只有搞清楚了对齐方式,才能知道他的内存布局。
点赞  2009-3-6 12:31
引用: 引用 6 楼 llKK0616 的回复:
把A的结构体也写出来啊,B结构体是按B中字长最长的变量的字节数来作为对齐字节,除非你有字长限制。


和A没关系呀
那只是个指针
点赞  2009-3-6 12:34
引用: 引用 4 楼 ultrapro 的回复:
你打印一下

B b;

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

看看

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

跟分析的结果是一样的。
奇怪了。
在struct B定义的前面没有用pragma编译指示强制设定对齐方式。
点赞  2009-3-6 14:56
sizeof(B ) = ?
点赞  2009-3-6 15:02
引用: 引用 3 楼 duoduozb 的回复:
这里指针p的地址为什么不是0x0C016110,而是114,10-13这四个字节的空间被拿来做什么了?


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

点赞  2009-3-6 15:03
&b.a  //0x0C016108  
&b.g  //0x0C01610E
&b.p  //0x0C016110

如果是这个值就没有什么问题呀?
点赞  2009-3-6 15:09
sizeof(B )=12

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



点赞  2009-3-6 17:27
关于嵌入式内存对齐的问题,是个很棘手的问题,我以前也遇到过,慢慢弄,不是一两句话说的明白的
www.01zg.com,将嵌入式进行到底!
点赞  2009-3-8 17:49
你试试这个:
#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
点赞  2009-3-9 12:59
谢谢大家的回答,基本上算是弄明白了。
点赞  2009-3-31 14:40
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复