儘管看似直觀地預期會出現錯誤,但在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中文網其他相關文章!