野指標與空指標

2022-06-13 06:27:10 字數 1754 閱讀 1820

一、空指標

空指標不指向任何物件,在檢視使用乙個指標之前可以首先檢查它是否為空。

定義空指標:

1

int *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)另一種情況是指標指向乙個臨時變數的引用,當該變數被釋放時,此時的指標就變成了乙個野指標,如下:

1

classa 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指向元素的話,編譯器 必然是會報錯的,那麼我們不如假...