首頁 > 後端開發 > C++ > 主體

為什麼在 C 中透過空指標呼叫方法有時會起作用?

Mary-Kate Olsen
發布: 2024-11-01 02:27:27
原創
921 人瀏覽過

Why Does Invoking a Method Through a Null Pointer in C   Sometimes Work?

理解未定義的行為:C 中的空指標方法呼叫

儘管看似直觀地預期會出現錯誤,但在C 中透過空指標呼叫方法可能看起來會執行。此行為引發了有關編譯器使用的標準合規性和最佳化實踐的問題。

要深入研究這個問題,請考慮以下範例:

<code class="cpp">#include <iostream>
using namespace std;

class test
{
    int i;
public:
    test():i(0){ cout << "ctor called" << endl;}
    void show()
    {
        cout << "show fun called" << endl;
    }
};

int main(int argc , char *argv[])
{
    test *ptr = NULL;
    ptr->show();
    return 0;
}</code>
登入後複製

在此程式碼段中,定義了一個類別測試使用建構函式和 show() 方法。在main()函數中,將一個指標ptr初始化為NULL,然後透過ptr呼叫show()方法。

令人驚訝的是,程式執行沒有錯誤,並且列印了“show fun called”,沒有觸發構造函數。這是因為在 C 中,編譯器知道空指標的類型,使其能夠識別方法的程式碼。由於 show() 方法不使用 this 指針,因此它運行成功。

但是,此行為在 C 標準中被認為是未定義的。編譯器可以透過在呼叫方法之前不檢查指標是否為 NULL 來最佳化程式碼。雖然這種優化提高了效率,但它會損害安全性和可預測性。

以上是為什麼在 C 中透過空指標呼叫方法有時會起作用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!