首页 > 学院 > 操作系统 > 正文

类型强转和字节对齐

2024-06-28 13:26:07
字体:
来源:转载
供稿:网友
类型强转和字节对齐  当一个较少字节对齐类型的指针强转为一个较多字节对齐的指针类型时,这样有些时候会产生问题。  在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上做开发时,需要注意这个强转和字节对齐的问题。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表