【据说是腾讯面试题】
#include <stdio.h>
#include <windows.h>
class A
{
WORD m_a1;
WORD m_a2;
A(){m_a1=1;m_a2=2;}
void fun(){printf( "%d,%d ",m_a1,m_a2);}
}
class B
{
DWORD m_a3;
B(){m_a3=3;}
void fun(){printf( "%d ",m_a3);}
}
main()
{
A a;
B *pb;
pb=B*(&a);
pb-> fun();
}
**以下资料来自网友回帖讨论**
输出结果:131073 = pow(2,17) + 1
将a指向一个A类型的域,在pb = (B*)&a时将pb强行指向了a所指向的区域
所以将会以B的DWORD格式读取A中2个WORD类型,所以值应该为2的17次方加1
1,A中的两个WORD连续存储,为00000000|00000001 00000000|00000010
2,强制转换之后,两个WORD成为一个DWORD
3,这个可能比较容易被忽略,这里用的是堆栈空间,因此WORD合并成DWORD时是2前1后.得为
00000000|00000010|00000000|00000001
4,可以试几个char被memcpy到一个int中的情况,也是这种结果.
**
这个题目考了几点:
1、关于sizeof(class),一个类的size只是此类中数据成员的size和。
2、考了内存分配的问题,内存分配都是从低端地址向高端地址分配的,所以是2的17次方加1而非2的16次方加2