微软的一道笔试题
#include <iostream>
class A{
public:
long a;
};
class B : public A
{
public:
long b;
};
void seta(A* data, int idx)
{
data[idx].a = 2;
}
int _tmain(int argc, _TCHAR *argv[])
{
B data[4];
for(int i=0; i<4; ++i)
{
data[i].a = 1;
data[i].b = 1;
seta(data, i);
}
for(int i=0; i<4; ++i)
{
std::cout<<data[i].a<<data[i].b;
}
return 0;
}
运行结果为什么是22221111 而不是21212121 能详细说下里面的细节么? C++ 微软
[解决办法]
问题出自函数seta,因为形参是A*,这样在计算data[idx].a = 2;时,实际的数组偏移地址是按照A的大小来计算的,而不能正确得到B的地址。这样一个循环下来之后,数组中就只有4个long的数据被修改了,也就是前两个B的a和b被修改了。
嘿嘿,不知道说清楚了没有。
[解决办法]
void seta(A* data, int idx)
{
data[idx].a = 2;
}
它被调用了4次,结果是:
data[0].a = 2;
data[1].a = 2;
data[2].a = 2;
data[3].a = 2;
so ...
[解决办法]
首先不看seta我们知道是11111111,然后看看seta做了什么,你传入的指针是B类型的,但是它是按照A类型来接收的,它就会按照A类型来解释这个指针,B类型是两个long的长度,A类型只是一个long的长度,所以这时data[1].a的内存空间里其实是data[0].b的数据,依次类推,内存中的数据存储依次是data[0].a,data[0].b,data[1].a,data[1].b,data[2].a,data[2].b,data[3].a,data[3].b,