还是数据对齐的问题。
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结尾的地址吗?
帮帮忙,谢谢!
1.即使编译选项是4字节对齐,sizeof 的值并不一定能被4整除,只能保证占用空间大于等于4的,是以能被4整除的地址开始;
2。0x0C016204 这个值是怎么看出来的,p的地址我觉得应该是&g + 2,0x0C01610E + 2 = 0x0C016120
3.被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几分钟。
你打印一下
B b;
&b.a
&b.g
&b.p
看看
还有你的系统是BigEndian还是LittleEndian
把A的结构体也写出来啊,B结构体是按B中字长最长的变量的字节数来作为对齐字节,除非你有字长限制。
没用过ADS。你的编译选项中默认对齐方式是什么?在struct B定义的前面有没有用了pragma编译指示强制设定对齐方式?只有搞清楚了对齐方式,才能知道他的内存布局。
引用: 引用 4 楼 ultrapro 的回复:
你打印一下
B b;
&b.a
&b.g
&b.p
看看
打印的话
&b.a //0x0C016108
&b.g //0x0C01610E
&b.p //0x0C016110
跟分析的结果是一样的。
奇怪了。
在struct B定义的前面没有用pragma编译指示强制设定对齐方式。
&b.a //0x0C016108
&b.g //0x0C01610E
&b.p //0x0C016110
如果是这个值就没有什么问题呀?
sizeof(B )=12
打印出来的确是这样的
&b.a //0x0C016108
&b.g //0x0C01610E
&b.p //0x0C016110
关于嵌入式内存对齐的问题,是个很棘手的问题,我以前也遇到过,慢慢弄,不是一两句话说的明白的
www.01zg.com,将嵌入式进行到底!
你试试这个:
#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