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
{
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
所以,这两个byte和tt的头两byte被复制到l,显示为0.00
不知道楼主写这么"奇怪"的代码要做什么,至少应该写成这样:
memcpy(&l, lbyte + ((BYTE*)(&(dw.tt)) - (BYTE*)(&(dw))), sizeof(double)); [说句实话,虽然可行,但实在不赞成写这么难看的东西]
如果楼主只是为了琢磨对齐技术那就自己从30递增往后尝试吧,你会满意编译器的耐心的:)
2)使用内存查看,看看内存中实际的内容,清楚地知道内存中实际的分配,就可以知道为什么了
3)另外对于结构中存在指针和数组的形式,建议不要使用memcpy,而老实的使用单个赋值的方式赋值。
int len=&((struct data *)0)->tt);
memcpy(&l,lbyte+len,sizeof(double));
字节对齐问题是项目开发最容易忽视的问题,必须再项目开发前约定
否则,大家都使用不同的对齐方式,连接在一起,避免不了要出问题
所以,计算偏移量在软件数据结构定义时已经约定软件运行中获得偏移量的实现并不难。10楼可以写一个通用程序,涉及到语法分析