1. 程式人生 > 實用技巧 >【面試題】呼叫空指標時一定會崩潰麼?

【面試題】呼叫空指標時一定會崩潰麼?

經常出現在面試中的一道題:呼叫空指標一定會崩潰麼?

首先我們來看這樣一段程式碼:

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 指標而已。

但是成員變數是屬於物件的。如果一個物件沒有分配記憶體,那呼叫物件中的變數自然也無從說起。