一、什麼是空指標和野指標
1.空指標
1> 沒有儲存任何記憶體位址的指標就稱為空指標(null指標)
2> 空指標就是被賦值為0的指標,在沒有被具體初始化之前,其值為0。
下面兩個都是空指標:
1 student *s1 = null;
2 3 student *s2 = nil;
複製**
2.野指標
"野指標"不是null指標,是指向"垃圾"記憶體(不可用記憶體)的指標。野指標是非常危險的。
二、野指標和空指標例子
接下來用乙個簡單的例子對比一下野指標和空指標的區別
1.首先,開啟xcode的記憶體管理除錯開關,它能幫助檢測垃圾記憶體
2.自定義student類,在main函式中新增下列**
1 student *stu = [[student alloc] init];
2 3 [stu setage:10];
4 5 [stu release];
6 7 [stu setage:10];
複製**
執行程式,你會發現第7行報錯了,是個野指標錯誤!
3.接下來分析一下報錯原因
1> 執行完第1行**後,記憶體中有個指標變數stu,指向了student物件
student *stu = [[student alloc] init];
假設student物件的位址為0xff43,指標變數stu的位址為0xee45,stu中儲存的是student物件的位址0xff43。即指標變數stu指向了這個student物件。
2> 接下來是第3行**
[stu setage:10];
這行**的意思是:給stu所指向的student物件傳送一條setage:訊息,即呼叫這個student物件的setage:方法。目前來說,這個student物件仍存在於記憶體中,所以這句**沒有任何問題。
3> 接下來是第5行**
[stu release];
這行**的意思是:給stu指向的student物件傳送一條release訊息。在這裡,student物件接收到release訊息後,會馬上被銷毀,所占用的記憶體會被**。
(release的具體用法會放到oc記憶體管理中詳細討論)
student物件被銷毀了,位址為0xff43的記憶體就變成了"垃圾記憶體",然而,指標變數stu仍然指向這一塊記憶體,這時候,stu就稱為了野指標!
4> 最後執行了第7行**
[stu setage:10];
這句**的意思仍然是: 給stu所指向的student物件傳送一條setage:訊息。但是在執行完第5行**後,student物件已經被銷毀了,它所占用的記憶體已經是垃圾記憶體,如果你還去訪問這一塊記憶體,那就會報野指標錯誤。這塊記憶體已經不可用了,也不屬於你了,你還去訪問它,肯定是不合法的。所以,這行**報錯了!
4.如果改動一下**,就不會報錯
1 student *stu = [[student alloc] init];
2 3 [stu setage:10];
4 5 [stu release];
6 7 stu = nil;
8 9 [stu setage:10];
複製**
注意第7行**,stu變成了空指標,stu就不再指向任何記憶體了
因為stu是個空指標,沒有指向任何物件,因此第9行的setage:訊息是發不出去的,不會造成任何影響。當然,肯定也不會報錯。
5.總結
1> 利用野指標發訊息是很危險的,會報錯。也就是說,如果乙個物件已經被**了,就不要再去操作它,不要再嘗試給它發訊息
。2> 利用空指標發訊息是沒有任何問題的,也就是說下面的**是沒有錯誤的:
[nil setage:10];
空指標和野指標
關於多次free 出現的野指標的原因 指標變數和指標變數所指的記憶體空間變數是兩個不同的概念 free 最主要釋放的指標變數所指的記憶體空間,因為記憶體資源是有限的,很寶貴,需要 利用 但是指標變數本身的值還是之前的指向,未重置成null 所以再次釋放的時候,指向了未知的記憶體區域,產生野指標 避免...
野指標和空指標
1.是取位址符號,是公升維度的,取其右邊變數的位址,如 d取變數d的位址。是取值符號 間接訪問 是降維度的,表示右邊指標變數所指向的變數,如 p表示指標變數p所指向的變數 2.float p d 則 p是變數d,而 p是變數p 即變數d 的位址p,p等價於p.3.在定義指標型別一定要和變數的型別對應...
c 空指標和野指標
野指標不同於空指標,空指標是指乙個指標的值為null,而野指標的值並不為null,野指標會指向一段實際的記憶體,只是它指向 我們並不知情,或者是它所指向的記憶體空間已經被釋放,所以在實際使用的過程中,我們並不能通過指標判空去識別乙個指標是否為野指標。野指標可能指向乙個可用的,但是正在被使用的空間,如...