BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #12342同步于 2012/5/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

真心请教一个ARM9-9260-VXWORKS,字节对齐问题

fwm2008
2012/5/31镜像同步6 回复
如题,编译器ARMV5 简单例如如下: //.h中定义如下: #pragma pack(1) typedef struct _NODE_T { struct _NODE_T * pre; struct _NODE_T * next; unsigned char ucaBuf[100]; }NODE_T; typedef struct _QUE_ { unsigned char ucReserved; //故意造成pstruNode地址不对齐 NODE_T * pstruNode; }QUE_T; #pragma pack(0) //.c中定义 QUE_T g_struQue; void testFun(NODE_T** ppstruNode) { int addr3 = 0; int addr4 = 0; if (ppstruNode == NULL) { return; } addr3 = (int)ppstruNode; addr4 = (int)(*ppstruNode); //疑问? addr3==addr1,但是addr4!=addr2,通过查看memory,发现是字节不对齐导致的?为啥这样呢? 谢谢指点 } void fun1(void) { int addr1 = 0; int addr2 = 0; g_struQue.pstruNode = (NODE_T*)malloc(sizeof(NODE_T)); if (g_struQue.pstruNode == NULL) { return; } addr1 = (int)&g_struQue.pstruNode; addr2 = (int)g_struQue.pstruNode; testFun((NODE_T**)&g_struQue.pstruNode); }
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
ArmStrong机器人#1 · 2012/6/1
addr2和1差多少?怎么是不对齐导致的? 看不出有任何道理,在两个func中对一个全局变量的地址读到的数据不同。 【 在 fwm2008 (littlemoney) 的大作中提到: 】 : 如题,编译器ARMV5 : 简单例如如下: : //.h中定义如下: : ...................
fwm2008机器人#2 · 2012/6/1
看了下内存: addr1=0x228fa9d9 addr2=0x235ffc18 addr3=addr1; addr4=0x005ffc18 d 0x228fa9d9,100,4 0x228fa9d0 3 0 7 4 b 8 0x228fa9d0:XXXXXXXX XXXXXXXX 5ffc1800 XXXXXX23 觉得是传递的不对齐地址导致指针取值不正确了。
ArmStrong机器人#3 · 2012/6/2
这个malloc居然能分配出奇数的地址空间,很奇葩,没见过 【 在 fwm2008 (littlemoney) 的大作中提到: 】 : 看了下内存: : addr1=0x228fa9d9 : addr2=0x235ffc18 : ...................
fwm2008机器人#4 · 2012/6/2
不是malloc分配出奇地址,是&pstruNode 是奇地址,呵呵。继续研究下。
ArmStrong机器人#5 · 2012/6/3
恩,是这样的,按理说编译的时候pstruNode的地址应该自动为4对齐,即它前面的char后面 有三字节空洞.造成你问题的原因应该是编译器的bug.至少也是给程序员的极大不便. http://www.cnblogs.com/yin-jingyu/archive/2011/10/14/2211252.html【 在 fwm2008 (littlemoney) 的大作中提到: 】 : 不是malloc分配出奇地址,是&pstruNode 是奇地址,呵呵。继续研究下。
fwm2008机器人#6 · 2012/6/4
#pragma pack(1) ...... #pragma pack(0) 后,不是就可以非对齐操作的吗?现在还没有找到原因,和arm处理器还有关系啊