zoukankan      html  css  js  c++  java
  • 类型强转和字节对齐

      当一个较少字节对齐类型的指针强转为一个较多字节对齐的指针类型时,这样有些时候会产生问题。
      在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上做开发时,需要注意这个强转和字节对齐的问题。
     
  • 相关阅读:
    第32章 数据库的备份和恢复
    Perl 打印关键字上下行
    mysql select * into OUTFILE 不会锁表
    独享表空间 ibdata1
    sql 使用单引号
    Oracle 维护常用SQL
    Mysql 独享表空间
    Mysql Perl unload表数据
    PLSQL 拼接SQL
    begin和declare
  • 原文地址:https://www.cnblogs.com/yemeng/p/3756125.html
Copyright © 2011-2022 走看看