2012-09-01 51 views
4

關於C標準的另一個問題。我已經測試了這個,我總是得到NULL < ptr爲真,其中ptr是與NULL不同的指針。但我知道標準說指針算術和比較只在數組邊界內定義。我只是不確定特定比較NULL < ptr是否合法。NULL指針<任何其他指針(NULL除外)?

編輯:我被讀數來說,K & R和我發現下面的話:

任何指針可以進行​​有意義的比較與零的相等或不相等。但是,對於不指向相同數組的成員的指針進行算術或比較的行爲是未定義的。

我不知道這是否會影響已經給這個問題的答案。無論如何,我仍然不確定是否p > NULL始終保證或不返回true,其中p是指針!=NULL

回答

6

NULL < ptr無效:空指針不能進行關係比較。這樣做會產生未定義的行爲。

你是正確的,你只能關聯比較指向同一個對象的指針(要麼是數組中的元素,要麼是聚合的子對象)。由於空指針不指向任何對象,因此不能將它與任何關係進行比較。

+0

不爲NULL與0值指針的特殊情況?所以只要你沒有引用你的0地址,那麼NULL

+6

@JoshPetitt:這裏最重要的是C中指針的關係比較受限於一組非常有限的場景。兩個操作數都必須是指向相同聚集的指針,否則'<'的行爲是未定義的。所以,如果你有'int main(){int x,y; return&x <&y; }',行爲是不確定的。由於空指針指向沒有對象,所以執行關係比較,其中任一操作數(或兩個操作數!)都是空指針會產生未定義的行爲。 –

+2

然而,請注意,定義了'(uintptr_t)&x <(uintptr_t)&y',並且對於該函數的任何給定調用,它將爲0或1. –

3

僅定義與另一個NULL(= true)或not(= false)的比較。

NULL是一般定義爲零,從而將一般比較小於,但實際上它不是定義