C++内存布局面试题

【据说是腾讯面试题】

#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值