2013-05-31 5 views
8

私はCのコードのこの部分を持っている:Cでこのフォームが正しい理由は?

void f(void *x) { 
    printf(">>> %p\n", x); 
} 

int main() { 

    f NULL; 
    return 0; 
} 

私が考えるには、NULLの定義についてですが、私は私の疑問を明確に説明したいと思います。

+0

ここで、あなたはちょうどいいのですか? –

+5

iircのNULLは#defineされた((void *)0)ので、コピーされたときには関数 – Daboyzuk

+0

のパラメータとして働くf((void *)0)が最初に表示されますフォーム 'f NULL'のようなものです。 – Kyrol

答えて

9

NULL((void *)0)又は(0)として定義されている場合、これは適切な関数呼び出しである、f ((void *)0)またはf (0)に展開。コンパイル中にカッコで囲まれていないものについては、コードエラーが出力されます。次のようにC NULL

+0

私はdownvoted、それは "朝の朝"の瞬間だったことに気づいた後、私のdownvoteを削除... –

+0

@ JohannesSchaub-litbああ、OK。そうですか。 –

+0

ありがとうございます。 – Kyrol

2

は、多くの場合、定義されています

#if !defined(NULL) 
    #define NULL ((void*)0) 
#endif 

このような場合は、その後NULLだけで特別なポインタで、あなたの例では、動作します。

+0

いいえ、C標準ではNULLの定義方法を定義していません。 –

+5

また、NULLはアドレス0 *へのポインタではありません。むしろ、ポインタコンテキストで出現した*リテラル値0 *はヌルポインタです。ヌルポインタの*実際の*値は実装固有であり、何でもかまいません。 – Jon

+2

標準では、NULLの定義は実装固有のものであると言います。しかし、6.3.2.3パート3のhttp://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdfにあります。それは、(void *)にキャストされた '0'をヌルポインタ定数といいます。 – jbr

関連する問題