问题描述:
地址:http://bbs.csdn.net/topics/390701174?page=1#post-396681441
360笔试题 类指针
#include <iostream>
using
namespace
std;
class
A{
public
:
void
a(){
cout <<
"func_a"
<< endl;
}
};
int
main(){
A * p = NULL;
p -> a();
return
0;
}
很好的答案:
成员函数不在类所占的空间里,实际调用成员函数有个隐藏的this指针,只要函数a()没有访问类的成员变量(这里也没定义成员变量),就不会有问题...
A * p = NULL; // 指明p是类型A的指针
p -> a(); // 调用函数a,类似于这样调用a(p);p是NULL,但没有访问p的成员变量就不会有问题
我的答案:
12: A * p = NULL; 004114CE mov dword ptr [p],0 13: p -> a(); 004114D5 mov ecx,dword ptr [p] 004114D8 call A::a (41114Fh) //这里的调用并没有调用实例p,而是调用的类A,所以与p是否指向野指针无关的 14: return 0;
代码修改为:
#include <iostream>
using
namespace
std;
class
A{
int
b;
public
:
void
a(){
b
= 0;
cout <<
"func_a"
<< endl;
}
};
int
main(){
A * p = NULL;
p -> a();
return
0;
}
7: void a(){ 00411510 push ebp 00411511 mov ebp,esp 00411513 sub esp,0CCh 00411519 push ebx 0041151A push esi 0041151B push edi 0041151C push ecx 0041151D lea edi,[ebp-0CCh] 00411523 mov ecx,33h 00411528 mov eax,0CCCCCCCCh 0041152D rep stos dword ptr es:[edi] 0041152F pop ecx 00411530 mov dword ptr [ebp-8],ecx 8: b=0; 00411533 mov eax,dword ptr [this] //此时调用的有this,也就是实例自己,然而实例指向的野指针,这样调用就会崩溃了。 00411536 mov dword ptr [eax],0 9: cout << "func_a" << endl; 0041153C mov esi,esp 0041