2013-05-31 18 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),所以当它复制到你有f((void *)0)作为函数 – Daboyzuk

+0

的参数是我第一次看到这个有种形式'f NULL'。 – Kyrol

回答

9

如果NULL被定义为((void *)0)(0),那么这个扩展到f ((void *)0)f (0),这是适当的函数调用。在编译过程中,任何非括号的代码都会出错。

+0

我倒下了,并且在注意到它是一个“星期一上午”的时刻后取消了我的downvote ...... –

+0

@ JohannesSchaub-litb啊,好的。我懂了。 – 2013-05-31 08:17:30

+0

非常感谢您的解释。 – Kyrol

2

在C NULL通常被定义如下:

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

如果是这种情况,那么NULL只是一个特殊的指针,例如你的作品。

+0

不,C标准没有定义NULL应该如何定义。 – 2013-05-31 08:10:33

+5

另外,NULL值不是指向地址0 *的指针。相反,在指针上下文中遇到的* literal值0 *是空指针。空指针的* actual *值是特定于实现的,可以是任何东西。 – Jon

+2

不够公平,标准说NULL的定义是特定于实现的。然而在6.3.2.3第3部分,在http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf。它表示将一个转换为(void *)的'0'称为空指针常量。 – jbr

相关问题