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上做开发时,需要注意这个强转和字节对齐的问题。
     
  • 相关阅读:
    Real-time 3D face tracking and reconstruction from 2D video
    Matlab Multiple View Geometry
    Multi-View 3D Reconstruction
    Scene Reconstruction
    OpenCV C++ Stereo Fisheye Calibration
    史上最全的Matlab资源电子书教程和视频下载合集
    CF-Based-Recommendation
    语种识别工具
    gdb调试
    C语言常见的函数调用
  • 原文地址:https://www.cnblogs.com/yemeng/p/3756125.html
Copyright © 2011-2022 走看看