天天看點

C語言 野指針和空指針

​​空指針​​

問題思考:

案例探索:不允許向null和非法位址拷貝記憶體

​​野指針​​

什麼情況下會導緻野指針?

指針變量未初始化

指針釋放後未置空

指針操作超越變量作用域

如何規避野指針

初始化時置 null

釋放時 置 null

空指針

标準定義了null指針,它作為一個特殊的指針變量,表示不指向任何東西。要使一個指針為null,可以給它指派一個零值。為了測試一個指針百年來那個是否為null,你可以将它與零值進行比較。

對指針解引用操作可以獲得它所指向的值。但從定義上看,null指針并未指向任何東西,因為對一個null指針因引用是一個非法的操作,在解引用之前,必須確定它不是一個null指針。

如果對一個null指針間接通路會發生什麼呢?

結果因編譯器而異。

像vs就報錯,像dev這種牛逼的編譯器就沒事。

不允許向null和非法位址拷貝記憶體:

運作上面的案例就會報錯。

C語言 野指針和空指針

野指針

在使用指針時,要避免野指針的出現:

野指針指向一個已删除的對象或未申請通路受限記憶體區域的指針。與空指針不同,野指針無法通過簡單地判斷是否為 null避免,而隻能通過養成良好的程式設計習慣來盡力減少。對野指針進行操作很容易造成程式錯誤。

任何指針變量剛被建立時不會自動成為null指針,它的預設值是随機的,它會亂指一氣。是以,指針變量在建立的同時應當被初始化,要麼将指針設定為null,要麼讓它指向合法的記憶體。

比如下面代碼

雖然手動給出了位址,但是仍沒有指向合法的記憶體

C語言 野指針和空指針

有時指針在free或delete後未指派 null,便會使人以為是合法的。别看free和delete的名字(尤其是delete),它們隻是把指針所指的記憶體給釋放掉,但并沒有把指針本身幹掉。此時指針指向的就是“垃圾”記憶體。釋放後的指針應立即将指針置為null,防止産生“野指針”。

不要傳回指向棧記憶體的指針或引用,因為棧記憶體在函數結束時會被釋放。

操作野指針是非常危險的操作,應該規避野指針的出現:

指針變量一定要初始化為null,因為任何指針變量剛被建立時不會自動成為null指針,它的預設值是随機的。

比如上面的案例,就可以改成:

C語言 野指針和空指針

當指針p指向的記憶體空間釋放時,沒有設定指針p的值為null。delete和free隻是把記憶體空間釋放了,但是并沒有将指針p的值賦為null。通常判斷一個指針是否合法,都是使用if語句測試該指針是否為null。

例如上面使用完了之後,可以進行下面的操作 釋放p 置 null。

繼續閱讀