目錄
- 一.簡介
- 二.野指標產生的原因
- 1.指標變數未初始化
- 2.指標釋放后之后未置空
- 三.避免野指標產生
- 1.初始化時置 NULL
- 2.釋放時置 NULL
- 四.猜你喜歡
零基礎 C/C++ 學習路線推薦 : C/C++ 學習目錄 >> C 語言基礎入門
一.簡介
野指標就是指標指向的位置是不可知的(隨機的、不正確的、沒有明確限制的);
二.野指標產生的原因
1.指標變數未初始化
任何指標變數剛被創建時不會自動成為 NULL 指標,它的預設值是隨機的,
所以,指標變數在創建的同時應當被初始化,要么將指標設定為 NULL ,要么讓它指向合法的記憶體,
如果沒有初始化,編譯器會報錯‘point’ may be uninitializedin the function,

2.指標釋放后之后未置空
指標在 free 或 delete 后未賦值 NULL ,它們只是把指標所指的記憶體給釋放掉,但并沒有處理指標本身,此時指標指向不可知的(隨機的、不正確的、沒有明確限制的),
釋放后的指標應立即將指標置為NULL,防止產生野指標,
三.避免野指標產生
1.初始化時置 NULL
指標變數一定要初始化為 NULL,因為任何指標變數(除了 static 修飾的指標變數)剛被創建時不會自動成為 NULL 指標,它的預設值是隨機的,
2.釋放時置 NULL
當指標 p 指向的記憶體空間釋放時,沒有設定指標 p 的值為 NULL ,delete 和 free 只是把記憶體空間釋放了,但是并沒有將指標 p 的值賦為 NULL ,
通常判斷一個指標是否合法,都是使用 if 陳述句測驗該指標是否為 NULL,例如:
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 野指標
//@Time:2021/06/20 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
#include<stdlib.h>
#include<stdio.h>
void main()
{
int *p = new int(6);
printf("釋放記憶體之前 p:%p\n", p);
//delete 釋放記憶體
delete p;
if (p != NULL) //delete 之后指標指向未知/隨機記憶體
printf("釋放記憶體之后 p:%p\n", p);
//*p = 7; //操作未知/隨機的記憶體地址,程式例外崩潰
system("pause");
}
/*
輸出:
釋放記憶體之前 p:016950E8
釋放記憶體之后 p:00008123
請按任意鍵繼續. . .
*/
重上面的代碼輸出結果可以看出:delete 之后,指標 p 地址并沒有被置為 NULL ,p 此時指向一塊隨機/未知的記憶體地址,一旦對未知的記憶體地址操作或者訪問,程式崩潰;
四.猜你喜歡
- C 語言邏輯運算子
- C 語言三目運算子
- C 語言逗號運算式
- C 語言 sizeof 和 strlen 函式區別
- C 語言 strcpy 和 strcpy_s 函式區別
- C 語言 memcpy 和 memcpy_s 區別
- C 語言 陣列定義和使用
- C 語言 陣列遍歷
- C 語言 陣列下標越界
- C 語言 陣列記憶體溢位
- C 語言 陣列下標越界和記憶體溢位區別
- C 語言 二維陣列定義和使用
- C 語言 二維陣列行數和列數計算
- C 語言 指標宣告和定義
- C 語言 指標 p++ / p–
- C 語言 p++/§++/_(p++)/_p++
- C 語言 使用指標遍歷陣列
- C 語言 指標和陣列區別
- C 語言 陣列指標
- C 語言 指標陣列
- C 語言 指標陣列和陣列指標區別
- C 語言 空指標 NULL
- C 語言 void 指標
- C 語言 野指標
未經允許不得轉載:猿說編程 ? C 語言 野指標
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/295946.html
標籤:C
