类型强转和字节对齐

王朝学院·作者佚名  2016-05-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

类型强转和字节对齐当一个较少字节对齐类型的指针强转为一个较多字节对齐的指针类型时,这样有些时候会产生问题。在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("\r\n");printf("s addr %p\r\n",&s);pt = (Test_t *)buff; //这里可能会出问题printf("pt->a %x b\n",pt->a,pt->b);}在arm平台下运行:root@hank:~#./arm-test33441122saddr0xbeb02ca2pt->a2cc83344 b11220002可以看到memcpy拷贝的数据打印没有问题,但是s的地址是只能被2整除,在强转成4字节对齐的指针类型时候,出现了错误,可以看出是从s地址的前两个字节地方开始读取数据,造成结构体中的a数据出错。在x86平台linux上运行:hank@hank-virtual-machine:~/project/arm$./a.out33441122saddr0xbfede93apt->a11223344,b2在x86平台上 s的地址也是不能被4整除,但是强转正常这个可能和平台有关,在arm上做开发时,需要注意这个强转和字节对齐的问题。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航