指標p被free掉了,卻沒有將其置為null。free函式只是將指標所指向的記憶體釋放掉了,使得記憶體成為自由記憶體,但是並沒有把指標本身的內容清除掉,所以指標仍指向已經釋放的動態記憶體。這是很危險的。
沒有及時初始化指標,在定義指標的時候一定要及時的初始化。
比如:int *p;
我們一般都會這麼去定義乙個指標變數,但是我們卻沒有去初始化指標。此時指標變數的值是未知的。也就是說如果我去訪問或修改這個指標所指向的那一段記憶體就會引起結果。
指標操作超越了變數的作用域範圍。如陣列越界。
不要返回指向棧記憶體的指標,因為返回時棧內部才能已經被釋放掉了,指標不能再繼續訪問該塊記憶體。
關於c語言中記憶體分割槽以及指標相關的用法可以參看我的另外兩篇部落格:
指標函式
c語言記憶體管理
說是解決,其實是預防野指標的形成。下面針對上面的形成原因來逐一提出常見的解決對策。
當使用free()函式釋放掉了malloc()自動申請堆區空間後,及時將指標置為null。如:
int
*p =
(int*)
malloc
(sizeof
(int))
;free
(p);
p =null
;
定義指標後要及時的初始化。如果沒有初始化就直接對該指標所指向的值進行賦值的話可能會造成不可預知的後果。所以應該養成乙個好習慣,定義指標的同時對其進行初始化。
在利用指標訪問陣列或者字串等的時候,應該注意範圍,不要越界訪問。
我們知道棧空間定義的指標是不能返回給另乙個函式,因為該函式執行完畢後,該指標指向的記憶體就被釋放掉了,若需要返回我們可以在該指標前面加上static修飾,將其放到靜態儲存區去。如不必要,不要返回指向棧空間的指標。
如向了解c語言中的記憶體分割槽,可以參考下我的另一篇部落格:
c語言記憶體管理
野指標原因及解決方法
define crt secure no warnings include include include 野指標產生的原因 指標變數和它所指的記憶體空間變數是兩個不同的概念 釋放了指標所指的記憶體空間,但是指標本身沒有重置成null 造成釋放的時候 通過if p1 null 避免方法 1 定義指標...
C語言野指標的產生原因及避免辦法
見如下程式例項 include include int main printf p1 d,p1 d n p1,p1 if p1 null 目的 釋放p1 printf p1 d,p1 d n p1,p1 system pause return 0 程式執行結果為 p1 0,p1 2031188 p1...
野指標產生原因及解決辦法
原因 指標變數宣告時沒有被初始化。解決辦法 指標宣告時初始化,可以是具體的位址值,也可讓它指向null。原因 指標 p 被 free 或者 delete 之後,沒有置為 null。解決辦法 指標指向的記憶體空間被釋放後指標應該指向null。原因 指標操作超越了變數的作用範圍。解決辦法 在變數的作用域...