c++一道假设性的面试题,求大神
struct A
{
int a;
int b;
char c;
char d;
}a;
struct B
{
int a;
int b;
char c;
char d;
char e;
}b;
初始化a、b;
a.a=1; a.b=2; a.c=3; a.d=4;
b.a=1; b.b=2; b.c=3; b.d=4; b.e=5;
假设a结构体直接复制个b成立: b = a;
问最后b.e的值是多少?
[解决办法]
b.e未知。
在32位系统中对齐到4字节边界的逻辑下,A中四个域都不需要对齐调整,但需要在d后面填充两个字节,以合吃族在A数组类型中,下一个元素依然从4字节边界开始,以保证两个int类型成员正好占据一个32位字。B也一样,需要在e后面填充一个字节。
这样,如果以memcpy的方式把A对象赋值给B对象,e对应的位置正好是A对象中的填充字节,填充字节会是什么数据,这一点很难确定。
[解决办法]
假设a结构体直接复制个b成立
……这个假设怎么成立的。
[解决办法]
b.e应该不变吧。
貌似考直接将基类对象直接赋值给派生类对象。
[解决办法]
我怎么也觉得应该是0啊……还写了个程序看了下:
#include <iostream>
using namespace std;
struct A{
int x;
int y;
char z;
char w;
}a;
struct B{
int x;
int y;
char z;
char w;
char e;
}b;
int main()
{
a.x = 1;a.y = 2;a.z = 3;a.w = 4;
b.x = 1;b.y = 2;b.z = 3;b.w = 4;b.e = 5;
int sizeA = sizeof(a);
int sizeB = sizeof(b);
cout << sizeA << endl;
cout << sizeB << endl;
return 0;
}
0x474012: 00 00 01 00 00 00 02 00
[解决办法]
00 00 03 04 05 00 00 00 ................
0x474022: 00 00 00 00 00 00 00 00
[解决办法]
00 00 00 00 00 00 00 00 ................