返回信息流如题,编译器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);
}
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #12342同步于 2012/5/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖
真心请教一个ARM9-9260-VXWORKS,字节对齐问题
fwm2008
2012/5/31镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
addr2和1差多少?怎么是不对齐导致的?
看不出有任何道理,在两个func中对一个全局变量的地址读到的数据不同。
【 在 fwm2008 (littlemoney) 的大作中提到: 】
: 如题,编译器ARMV5
: 简单例如如下:
: //.h中定义如下:
: ...................
看了下内存:
addr1=0x228fa9d9
addr2=0x235ffc18
addr3=addr1;
addr4=0x005ffc18
d 0x228fa9d9,100,4
0x228fa9d0 3 0 7 4 b 8
0x228fa9d0:XXXXXXXX XXXXXXXX 5ffc1800 XXXXXX23
觉得是传递的不对齐地址导致指针取值不正确了。
这个malloc居然能分配出奇数的地址空间,很奇葩,没见过
【 在 fwm2008 (littlemoney) 的大作中提到: 】
: 看了下内存:
: addr1=0x228fa9d9
: addr2=0x235ffc18
: ...................
恩,是这样的,按理说编译的时候pstruNode的地址应该自动为4对齐,即它前面的char后面
有三字节空洞.造成你问题的原因应该是编译器的bug.至少也是给程序员的极大不便.
http://www.cnblogs.com/yin-jingyu/archive/2011/10/14/2211252.html【 在 fwm2008 (littlemoney) 的大作中提到: 】
: 不是malloc分配出奇地址,是&pstruNode 是奇地址,呵呵。继续研究下。