未初始化和非法的指標

2021-06-27 09:26:08 字數 810 閱讀 7059

下面這個**段說明了乙個極為常見的錯誤:

int *a;

...*a = 12;

這個宣告建立了乙個名叫a的指標變數,後面那條賦值語句把12儲存在a所指向的記憶體位置。

警告:

但是究竟a指向**呢?我們宣告了這個變數,但從未對它進行初始化,所以我們沒有辦法**12這個值將儲存於什麼地方。從這一點看,指標變數和其他變數並無區別。如果變數是靜態的,它會被初始化為0;但如果變數是自動的,它根本不會被初始化。無論是哪種情況,宣告乙個指向整型的指標都不會「建立」用於儲存整型值的記憶體空間。

所以,如果程式執行這個賦值操作,會發生什麼情況呢?如果你運氣好,a的初始化會是個非法位址,這樣賦值語句將會出錯,從而終止程式。在unix系統上,這個錯誤被稱為「段違例」(segmetation violation)或「記憶體錯誤」(memory fault)。它提示程式試圖訪問乙個並未分配給程式的記憶體位置。在一台執行windows的pc上,對未初始化或非法指標進行間接的訪問操作是一般保護性異常(general protection exception)的根源之一。

對於那些要求整數必須儲存於特定邊界的機器而言,如果這種型別的資料在記憶體中的儲存位址處在錯誤的邊界上,那麼對這個位址進行訪問時將會產生乙個錯誤。這種錯誤在unix系統中被稱為「匯流排錯誤(bus error)」。

乙個更為嚴重的情況是:這個指標偶爾可能包含了乙個合法的位址。接下來的事很簡單:位於那個位置的值被修改,雖然你並無意去修改它。像這種型別的錯誤非常難以捕捉,因為引發錯誤的**可能與原先用於操作那個值的**完全不相干,所以,在你對指標進行間接訪問之前,必須非常小心,確保它們已被初始化!

未初始化和非法的指標

下面這個 說明了乙個極為常見的錯誤 int a a 12 警告 究竟a應該指向 我們宣告了這個變數,但從未對它進行初始化,所以我們沒有辦法 12這個值儲存於什麼地方。從這一點看,指標變數和其他變數並無區別,如果變數是靜態的,它會被初始化為0.但如果變數是自動的,它根本不會被初始化。無論哪種情況,宣告...

未初始化指標

今天碰到個未初始化指標的問題。大意如下 class a public b m pb class b blah,blah,blah void func a pa b pb new b 初始化pb.pa m pb pb std vector a aptrs apters.push back pa fun...

未初始化的指標

1.我們定義了乙個指標,一定要初始化,比如 int a,沒有初始化時,a的指向是不明確的。若它指向非法位址,這時的操作會報異常 若它指向乙個合法位址,這是非常危險的,因為這樣可能更改乙個正在使用的數值。若在mcu中,指標指向非法位址,程式會跑飛。2.關於null指標,有時我們會寫乙個函式,這個函式返...