為什么下面的代碼會產生分段錯誤!!!
//somewhere in main ... int *pointer; if(pointer) cout << *pointer; ...
但是以下代碼略有改變
//somewhere in main ... int *pointer = nullptr; if(pointer) cout << *pointer; ...
問題是 C 中的什么使未初始化的指標為真 - 并導致崩潰!
uj5u.com熱心網友回復:
為什么 C 將未初始化的原始指標(或說守護程式)識別為真?
行為可能看起來如此,因為程式的行為是未定義的。
為什么下面的代碼會產生分段錯誤!!!
因為程式的行為是未定義的,這是可能的行為之一。
但是以下代碼略有改變
因為您沒有在更改后的程式中讀取不確定的值,并且該程式的行為已明確定義,并且已定義的行為是不會輸入 if 陳述句。
結論:不要讀取未初始化的變數。否則你最終會得到一個損壞的、無用的程式。
盡管不需要編譯器為您診斷未定義的行為,但幸運的是,高質量的編譯器能夠檢測到這種簡單的錯誤。這是示例輸出:
warning: 'pointer' is used uninitialized [-Wuninitialized]
if(pointer)
^~
編譯器通常無法檢測到所有復雜的違規行為。但是,運行時清理程式甚至可以檢測到復雜的情況。示例輸出:
==1==WARNING: MemorySanitizer: use-of-uninitialized-value
除了讀取未初始化的值之外,即使它已初始化,if (pointer)也不一定意味著您可以通過指標間接訪問。這只意味著指標不為空。除了 null 之外,其他指標值對于間接通過也是不安全的。
uj5u.com熱心網友回復:
因為您的未初始化指標被隱式轉換為布林值。其中 0 轉換為 false,其他所有值都轉換為 true。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/419835.html
標籤:
上一篇:從CSV檔案填充雙指標矩陣
