C語言中NULL究竟是不是0 等問題?
- 2020 年 3 月 31 日
- 筆記
有人提問:C語言中NULL究竟是不是0 等問題?
NULL與數字0是不是等價的?
在C語言中,NULL一般有如下定義(在stddef.h中):
#define NULL ((void*)0)
看起來似乎是一樣的?沒錯從這裡看,值確實一樣的。
但是,還記得在《void*是一種怎樣的存在》中講到過的嗎?雖然它們值是一樣的,但是它們的含義不一樣。 舉個簡單的例子:
//來源:公眾號【編程珠璣】 //作者:守望先生 #include <stdio.h> int main(void) { int *p = NULL; int a = 0; p++; a++; printf("p value:%p a value:0x%xn",p,a); return 0; }
輸出結果:
p value:0x4 a value:0x1
看到了嗎,同樣的值,行為類似,卻有著不一樣的結果。
NULL可以理解為p指向地址值為0的內容?
就當前的定義來講,可以這麼理解,不過,之前就已經在《為什麼解引用NULL會出現掛死》中說過,訪問0地址的內容是不被允許的!
NULL存在的意義是什麼
那麼NULL作用是什麼?實際上,它是為了保證NULL和其他任何非NULL指針對象或者是函數不相等。 也就是說,一個實實在在的指針對象或者函數(了解更多關於函數指針),和NULL是不等的。
或者說,如果NULL轉換為另外一種指針類型,那麼它和NULL還是相等的。通俗講就是
int *p = (int*)NULL;
那麼int*類型的p和void*類型的NULL,一定是相等的。
NULL一定得是0值嗎?
實際上,NULL可以是整數0(C++中NULL為0,相關閱讀《為什麼建議你用nullptr而不是NULL》),也可以是某個整數值轉換為void*。
實際上NULL並不一定需要是0。
總結
關於NULL和0,理解它們的類型不一樣是很關鍵的,至於值本身是不是一樣,並不重要。 更多內容可以參考C11標準文檔的6.3.2.3 Pointers一節。
- NULL的值可以為0,但不是必須為0
- NULL用來和其他指針對象和函數區分開
- NULL和0含義不一樣
