当一个较少字节对齐类型的指针强转为一个较多字节对齐的指针类型时,这样有些时候会产生问题。
在arm的平台上,这个问题比较明显,在x86平台上运行后没这个问题
typdef struct
{
int addr;
int rdda;
}Test_t;
int main()
{
short int a;
short int s[2];
short int *pt = &s;
Test_t tt;
Test_t *pt = NULL;
tt.addr= 0x11223344;
memcpy(s,&tt,sizeof(Test_t)); //没有问题,数据能正确拷贝
for(a = 0; a < 2; a++)
printf("%x",s[a]);
printf("
");
printf("s addr %p
",&s);
pt = (Test_t *)buff; //这里可能会出问题
printf("pt->a %x b
",pt->a,pt->b);
}
在arm平台下运行:
root@hank:~# ./arm-test
33441122
s addr 0xbeb02ca2
pt->a 2cc83344 b 11220002
可以看到memcpy拷贝的数据打印没有问题,但是s的地址是只能被2整除,在强转成4字节对齐的指针类型时候,出现了错误,可以看出是从s地址的前两个字节地方开始读取数据,
造成结构体中的a数据出错。
在x86平台linux上运行:
hank@hank-virtual-machine:~/project/arm$ ./a.out
33441122
s addr 0xbfede93a
pt->a 11223344,b 2
在x86平台上 s的地址也是不能被4整除,但是强转正常
这个可能和平台有关,在arm上做开发时,需要注意这个强转和字节对齐的问题。