首页 > 其他 > 详细

【面试题】调用空指针时一定会崩溃么?

时间:2020-08-06 19:46:51      阅读:81      评论:0      收藏:0      [点我收藏+]

经常出现在面试中的一道题:调用空指针一定会崩溃么?

 

首先我们来看这样一段代码:

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!