趋势科技笔试【7】

题目:下列程序的输出是什么?

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都会崩溃。
 

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/wangicter/archive/2012/10/05/4767275.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值