struct data
{
BYTE t[30];
double tt;
} ;
data dw;
dw.tt=3;
double l; BYTE *lbyte=new BYTE[sizeof(data)];
memcpy(lbyte,&dw,sizeof(data)); memcpy(&l,lbyte+30,sizeof(double)); CString str;
str.Format(_T("%.2f"),l);
::AfxMessageBox(str);最后总显示0.00,如果把结构中tt的类型由double改为WORD则没有问题,正常显示3

解决方案 »

  1.   

    t[30]后面与double tt之间有2个byte的空(release容随机,debug为0xcccc)。
    所以,这两个byte和tt的头两byte被复制到l,显示为0.00
      

  2.   

    memcpy(&l,lbyte+30,sizeof(double)); 
    不知道楼主写这么"奇怪"的代码要做什么,至少应该写成这样:
    memcpy(&l, lbyte + ((BYTE*)(&(dw.tt)) - (BYTE*)(&(dw))), sizeof(double)); [说句实话,虽然可行,但实在不赞成写这么难看的东西]
    如果楼主只是为了琢磨对齐技术那就自己从30递增往后尝试吧,你会满意编译器的耐心的:)
      

  3.   

    用offset来 得到 后面变量的偏移量吧
      

  4.   

    1)这个是因为内存对齐的方式引起的。有些编译器默认为4BYTE,有的是8BYTE,需要查看相关的资料。
    2)使用内存查看,看看内存中实际的内容,清楚地知道内存中实际的分配,就可以知道为什么了
    3)另外对于结构中存在指针和数组的形式,建议不要使用memcpy,而老实的使用单个赋值的方式赋值。
      

  5.   

    我明白了,谢谢楼上各位,我是因为下面的原因写这个代码,可能我的思路不对,是不是有其它更好的方法实现这个功能?这段代码是简化后的,这其实是个我自己写的对数据存取的基础类,我在读取一个数据文件时,先会从文件头读取文件中所存储数据的数据格式,类似这样:[用途,数据类型,偏移地址],然后按这个格式读取这个文件,也就是说在读取代码中其实没有data这个结构,所以要用到上面的代码.
      

  6.   

    还是对齐造成的,
    int len=&((struct data *)0)->tt);
    memcpy(&l,lbyte+len,sizeof(double)); 
      

  7.   

    to sonic123
    字节对齐问题是项目开发最容易忽视的问题,必须再项目开发前约定
    否则,大家都使用不同的对齐方式,连接在一起,避免不了要出问题
    所以,计算偏移量在软件数据结构定义时已经约定软件运行中获得偏移量的实现并不难。10楼可以写一个通用程序,涉及到语法分析