趋势科技笔试【7】
2012-10-05 22:02
197 查看
题目:下列程序的输出是什么?
答案:
1和2正常运行,3处会导致程序崩溃。
解释:
很显然,c在括号外已经析构了,p必然是一个野指针。
那么野指针能不能够继续调用f()函数呢。实验证明,是可以的。
那么原因在哪里呢?
当我们定义一个C c时,sizeof(c)=成员变量的大小,不包含函数的大小。因此可见,函数列表是属于类的,不属于一个对象。
f()函数可以解释如下:
void f(const C* this)
{
cout << "foo C" <<endl;
}
当传入野指针或空指针时,f(NULL)中的NULL未调用任何东西,因此不会造成程序崩溃,程序是安全的。
以上运行结果是在vs下的结果;如果在dev下,则该编译器不允许空指针调用,因此在2,3都会崩溃。
class C { public: int a; ~C(){cout <<"~C"<<endl;} void f(){std::cout << "foo C" <<std::endl;} }; int _tmain(int argc, _TCHAR* argv[]) { C *p = NULL; if(!p) { C c; p = &c; } p->f();//1 ((C*)NULL)->f();//2 delete p;//3 getchar(); return 0; }
答案:
1和2正常运行,3处会导致程序崩溃。
解释:
很显然,c在括号外已经析构了,p必然是一个野指针。
那么野指针能不能够继续调用f()函数呢。实验证明,是可以的。
那么原因在哪里呢?
当我们定义一个C c时,sizeof(c)=成员变量的大小,不包含函数的大小。因此可见,函数列表是属于类的,不属于一个对象。
f()函数可以解释如下:
void f(const C* this)
{
cout << "foo C" <<endl;
}
当传入野指针或空指针时,f(NULL)中的NULL未调用任何东西,因此不会造成程序崩溃,程序是安全的。
以上运行结果是在vs下的结果;如果在dev下,则该编译器不允许空指针调用,因此在2,3都会崩溃。
相关文章推荐
- C++经典笔试题及参考答案-趋势科技
- 【2014校招】趋势科技笔试
- 趋势科技2014校园招聘笔试题
- 哥的传奇笔试经历-趋势科技、绿盟科技、搜狐、百度
- 趋势科技笔试题
- 趋势科技笔试面试经历zz
- 2012.9.20以来的笔试面试(中兴,百度,趋势科技等)
- 趋势科技笔试题
- 趋势科技2011校招笔试题+答案解析
- 趋势科技2014年暑期实习生笔试题
- 趋势科技笔试题1
- 趋势科技笔试题
- C++经典笔试题及参考答案-趋势科技
- 趋势科技2015笔试题-南京
- 2014年趋势科技笔试+面试(实习生)
- 趋势科技几道笔试题
- C++经典笔试题及参考答案-趋势科技
- 2015趋势科技校招笔试面试
- 趋势科技2011校招笔试题+答案解析
- 2015年趋势科技笔试A卷