2011-05-28 49 views
1

我正在讀「編程的實踐」,它說,沿着在C列表走一個標準的循環是走:標準成語沿列表用C

for (p=list;p != NULL;p=p->next) 
... 

我的問題是如何呢NULL工作?我自己已經在程序中使用了它,但從未停下來思考它是如何工作的。

我想,NULL必須是一個標準的宏定義在一個非常基本的頭文件,如stdio.h 但它被定義爲?是嗎?

#define MACRO 0 

這裏是如何工作的0時,我們比較的指針爲0,這0可能是一個有效的內存地址爲0,那麼我們怎麼區分地說,我們實際上意味着無效的地址即指針具有邏輯空值?

謝謝,

+5

哦,不!不要再! – 2011-05-28 13:09:54

+0

LOL [10個以上] – 2011-05-28 13:13:18

回答

1

它被定義爲0,是的。事情是0是而不是有效的內存地址;電腦實際上放在一起,試圖訪問該地址是一個錯誤。

試試你的機器上運行這個程序,如果你要堅持,0是一個法定地址:

#import <stdio.h> 

int main() { 
    int *p = 0; 
    printf("No read error: %d\n", *p); 
    *p = 1; 
    printf("No write error either\n"); 
} 
+0

準確地說,它幾乎總是被定義爲'((void *)0)'。只有非常蹩腳的實現會將其定義爲簡單的'0',這會在將NULL與非指針類型進行比較時抑制編譯時錯誤。 – 2011-05-28 13:28:51

+0

我幾乎可以肯定有一些架構的零是一個有效的地址。強制轉換爲指針是一種約定,沒有別的。啓用if(ptr)習語。 – 2011-05-28 13:33:51

+0

在我意識到的所有體系結構中,它肯定是一個有效的* physical *地址。 – 2011-05-28 13:51:11

4

的C FAQ對NULL pointers一整節。簡短摘要:

  • 恆定 int值爲零(0)中,在編譯器知道是 需要一個指針,被視爲「空指針」的上下文:已知的指針值不點在有效的 內存地址
  • 這隻適用於常數,而不是任何整數值;例如,將一個變量賦值爲0到 ,然後使用它作爲指針,不保證該值將是 空指針
  • 實際地址可能是或不是零;編譯器可以將其翻譯成另一種 地址
  • 幾個標準庫頭定義宏NULL,無論是作爲一個普通的0或 澆鑄成一個指向:((void *) 0)(C標準允許使用)
+0

感謝指向c-faq的指針! :-) – xyz 2011-05-28 13:26:37