C语言野指针讲解
在實際工程開發中經常會聽到“野指針”,那么問題來了,什么是野指針?野指針有什么危害?
在介紹野指針之前,先了解一點,指針變量的本質是值,只不過這個值有點特殊,是一個內存地址值
“野指針”指的是指針變量中的值是非法的內存地址,但“野指針”不是空指針(NULL),“野指針”指向的內存是不可用的,“野指針”往往會造成內存越界、段錯誤等問題
補充:合法的內存地址包括定義的變量的地址、malloc函數申請堆內存返回的地址(但未使用free釋放)
?
介紹過“野指針”的概念后就該了解一下“野指針”的由來,這樣在工程開發中我們就可以去避免野指的產生
1、局部指針變量沒有初始化。因為局部變量不像全局變量那樣,不賦值會自動初始化為0,所以局部指針變量不初始化話的話,指向的是一塊程序員無法把控的內存,我們在定義局部指針變量會初始化為NULL,局部變量初始化為0
2、指針所指向的變量在指針使用之前就被銷毀了。最常見的在函數調用結束后返回指向局部變量的指針,所以我們絕對不要在函數中返回局部變量和局部數組的地址,關于這種情況后續我再介紹堆棧的時候再舉例說明
3、使用已經釋放過的指針。比如malloc申請的堆空間通過free釋放后又去調用該指針,一定要在釋放過后將指針變量的值賦值為NULL
4、指針運算錯誤。比如有些情況下雖然初始化或者申請堆空間并未造成“野指針”,但是操作指針不當造成指針指向一塊已經被別的進程使用的內存,為避免這種情況,一定要確保字符數組要以‘\0’結尾,自己編寫的內存相關函數指定長度信息(防止內存越界)
5、進行了錯誤的強制類型轉換。比如我們在寫嵌入式程序的時候,會將int類型的一個數據強制轉換成一個指針類型用來表示寄存器的地址,這個時候有可能會因為這個數字取值不當,正好對應的內存已經被使用
?
總結
- 上一篇: 安装ubuntu后必须做的事情(对我而言
- 下一篇: 对数函数定义域和值域_对数函数定义域和值