经常出现在面试中的一道题:调用空指针一定会崩溃么?
首先我们来看这样一段代码:
class A { public: void print() { cout << "A" << endl; } }; int main() { A* pa = nullptr; pa->print(); return 0; }
这时候明显能看出来pa是一个空指针。但是这个时候如果你要去运行的话其实并不会崩溃。并且输出是A。
这是因为这段代码实质上是这样一段代码:
void print(A* this) { cout << "A" << endl; } int main() { A* pa = nullptr; print(pa); return 0; }
可以看出来指针在函数中并没有被调用,所以自然而然也不会崩溃了。
但是如果在A类里加入一个成员变量后,并且调用它:
class A { public: void print() { cout << m << endl; } int m = 0; }; int main() { A* pa = nullptr; pa->print(); return 0; }
这个时候再去执行自然而然就会崩溃。
原因和上面类似,这段代码实质上是这样一段代码:
void print(A* this) { cout << this->m << endl; } int main() { A* pa = nullptr; print(pa); return 0; }
这个时候去调用一个空指针的成员变量自然而然会崩溃了。
为什么调用空指针的成员函数不会崩溃,而调用空指针的成员变量就会崩溃呢?
是因为成员函数和普通函数没有本质什么区别,只是比普通函数多了一个 this 指针而已。
但是成员变量是属于对象的。如果一个对象没有分配内存,那调用对象中的变量自然也无从说起。
原文:https://www.cnblogs.com/Tanc-ANT/p/13448197.html