cc

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  38 随笔 :: 14 文章 :: 21 评论 :: 0 Trackbacks
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();
}
输出是什么?
posted on 2006-12-17 15:30 醒目西西 阅读(582) 评论(2)  编辑 收藏 引用 所属分类: 编程相关

评论

# re: 一道腾讯的面试题 2006-12-17 15:30 醒目西西
结果是1
pb=(b*)(&A); 将A的地址传给了pb,并强制转化为b类的地址
pb->fun(); 调用b 的fun()方法,不过此时ma_3,是a类的ma_1,所以输出1

你可以改一下程序运行就知道了
#include <stdio.h>
class a
{
char m_a1;
char m_a2;
public:
a(){m_a1=1;m_a2=2;}
void fun(){printf("%d,%d",m_a1,m_a2);}
};
class b
{
char m_a3;
public:
b(){m_a3=3;}
void fun(){printf("%dggggg",m_a3);}//可以看出是调用了该方法
};
void main()
{
a A;
b *pb;
pb=(b*)(&A);
pb->fun();
}   回复  更多评论
  

# re: 一道腾讯的面试题 2006-12-17 15:30 醒目西西
在win32和32位编译器的环境下,结构体(struct和class)中的数据域是按声明的先后顺序,“向上生长”的。就是说若结构体A中按先后声明了两个域a、b,则存放b的地址大与存放a的地址!注意,有些编译器为了提高在32位系统中对内存的访问速度,所以使用了内存对齐技术--结构体中的各个域是按4字节对齐的!

我们假设楼主提供的题目如下:
#include <stdlib.h>
#include <stdio.h>
class a {
short m_a1;
short m_a2;
public:
a() {
m_a1 = 1;
m_a2 = 2;
}
void fun() {
printf("%d,%d", m_a1, m_a2);
}
};

class b{
int m_a3;
b() {
m_a3 = 3;
}
public:
void fun() {
printf("%d", m_a3);
}
};

int main() {
printf("sizeof a, b = %d %d\n", sizeof(a), sizeof(b));
a a;
b *pb;
pb = (b*)(&a);
pb -> fun();
}

就是说,a的大小是8字节,b的大小是4字节!
而b::fun()就是按int的格式输出结构体中的前四个字节!所以输出1!

但是,若没有使用内存对齐技术!上面的问题就麻烦了!
a和b 的大小都是4字节!

a a+2
1 2 -> (2 << 16) | 1

所以应该输出:

131073  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理