一、空指標
空指標不指向任何物件,在檢視使用乙個指標之前可以首先檢查它是否為空。
定義空指標:
1int *p1=nullptr; //
等價於int *p1=0;
2int *p2=0; //
直接將p2初始化為字母常量034
/*要包含#include*/5
int *p3=null; //
等價於int *p3=0;
1、null
在c中,習慣將null定義為void*指標值0,也可以將null定義為整常數0:
1#define null (void*)0
而在c++中,null被明確定義為常整數0
1#define null 0
導致不同定義的根本原因是:隱式型別轉換(implicit conversion)。c++不支援void*到其他型別的隱式轉換。
2、nullptr
c++11新標準中引入nullptr,為什麼?-------原因和c++的過載函式有關。
1 #include//c++中使用null要包括標頭檔案
2void func(int) {} //#13
void func(char *) {} //#24
5 func(null); //
呼叫那個版本
雖然函式#2的形參是char *指標,但還是呼叫函式#1,根本原因是c++中null擴充套件為0,也是常數int。常數0既是整數常量,也是空指標常量。
為了,解決這種二義性,c++11標準引入關鍵字nullptr,它是一種空指標常量。若第五行為一下**,則會呼叫#2.。
1 func(nullptr);
二、野指標
野指標不是空指標,是指向「垃圾」記憶體(不可用記憶體)的指標。
野指標的成因主要有三種:
1、指標變數沒有被初始化
任何指標變數剛被建立時不會自動成為null指標,它的預設值是隨機的,它會亂指一氣。所以,指標變數在建立的同時應當被初始化,要麼將指標設定為null,要麼讓它指向合法的記憶體。
2、指標p被free或者delete之後,沒有置為null(nullptr)。這樣做會讓人誤以為p是個合法的指標。
free和delete只是把指標所指向的記憶體給釋放掉,但並沒有把指標本身給清理掉。這時候的指標依然指向原來的位置,只不過這個位置的記憶體資料已經被銷毀。通常會用語句if (p != null)進行防錯處理。很遺憾,此時if語句起不到防錯作用,因為即便p不是null指標,它也不指向合法的記憶體塊。所以在指標指向的記憶體被釋放後,應該將指標置為null。
3、指標操作超越了變數的作用範圍。
(a)由於c/c++中指標有++操作,因而在執行該操作的時候,稍有不慎,就容易指標訪問越界,訪問了乙個不該訪問的記憶體,結果程式崩潰;
(b)另一種情況是指標指向乙個臨時變數的引用,當該變數被釋放時,此時的指標就變成了乙個野指標,如下:
1classa 2
5};6void test(void)7
13 p->func(); //
p是「野指標」
14 }
ref:
好好看)
空指標與野指標
首先什麼是空型別呢,空型別就是void,自然,空型別指標就是void void 可以指向任何型別物件的位址,表示這是乙個指標,和位址值有關,但不知道儲存在此位址上的物件的型別,所以在取空型別指標所指向的值的時候,應將空型別指標轉換為對應的指標型別 int a 10 char b a float c ...
空指標與野指標
野指標 不是null指標,是指向 垃圾 記憶體的指標。人們一般不會錯用null指標,因為用if語句很容易判斷。但是 野指標 是很危險的,if語句對它不起作用。野指標的成因主要有兩種 一 指標變數沒有被初始化。任何指標變數剛被建立時不會自動成為null指標,它的預設值是隨機的,它會亂指一氣。所以,指標...
指標,野指標,空指標,賦值?
bug中最可怕的是野指標,那麼問題來了,野指標是什麼?是如何產生的?為什麼程式設計師會 忘記 昨天除錯時,我發現了乙個野指標,由此我明白了。a的值成了亂碼,而且gcc編譯器並沒有報錯,那麼請看下面的 那麼我們假設a是指標,一旦我們如同該 一般不讓a指向元素的話,編譯器 必然是會報錯的,那麼我們不如假...