野指針
1.關於野指針
- 野指針在我們C語言編程的過程中是很常見的,那麼何爲野指針以及野指針是如何形成的呢?這是我們首先要解決的問題。然後纔是如何去解決野指針的問題。
- 野指針是指向垃圾內存的指針,而不是NULL;或者說是指向未知內存的指針。
2.野指針形成的原因
-
指針P被free掉了,卻沒有將其置爲NULL。free函數只是將指針所指向的內存釋放掉了,使得內存成爲自由內存,但是並沒有把指針本身的內容清除掉,所以指針仍指向已經釋放的動態內存。這是很危險的。
-
沒有及時初始化指針,在定義指針的時候一定要及時的初始化。
比如:
int *p;
我們一般都會這麼去定義一個指針變量,但是我們卻沒有去初始化指針。此時指針變量的值是未知的。也就是說如果我去訪問或修改這個指針所指向的那一段內存就會引起結果。 -
指針操作超越了變量的作用域範圍。如數組越界。
-
不要返回指向棧內存的指針,因爲返回時棧內部才能已經被釋放掉了,指針不能再繼續訪問該塊內存。
關於C語言中內存分區以及指針相關的用法可以參看我的另外兩篇博客:
指針函數
C語言內存管理
3.解決野指針問題的幾個辦法
說是解決,其實是預防野指針的形成。下面針對上面的形成原因來逐一提出常見的解決對策。
- 當使用free()函數釋放掉了malloc()自動申請堆區空間後,及時將指針置爲NULL。如:
int *p = (int *)malloc(sizeof(int));
free(p);
p = NULL;
- 定義指針後要及時的初始化。如果沒有初始化就直接對該指針所指向的值進行賦值的話可能會造成不可預知的後果。所以應該養成一個好習慣,定義指針的同時對其進行初始化。
- 在利用指針訪問數組或者字符串等的時候,應該注意範圍,不要越界訪問。
- 我們知道棧空間定義的指針是不能返回給另一個函數,因爲該函數執行完畢後,該指針指向的內存就被釋放掉了,若需要返回我們可以在該指針前面加上static修飾,將其放到靜態存儲區去。如不必要,不要返回指向棧空間的指針。
如向瞭解C語言中的內存分區,可以參考下我的另一篇博客:
C語言內存管理