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含義不一樣