什么类型是NULL?

时间:2014-02-04 17:26:48

标签: c null

我想知道C中的Null是什么类型。这可能是重复的,但我一直在搜索中获取有关void类型的信息。也许更好的方法是可以为任何类型函数返回NULL吗?例如:

int main(){
    dosomething();
    return NULL;
}

这有用吗?

2 个答案:

答案 0 :(得分:7)

Per C 2011 7.19 3,NULL“扩展为实现定义的空指针常量”(当包含多个标头中的任何一个时:<locale.h><stddef.h>,{{1 },<stdio.h><stdlib.h><string.h><time.h>)。

根据6.3.2.3 3,空指针常量是“[A] n整数常量表达式,值为0,或者这样的表达式转换为类型 void * 。”因此,C例如,实现可以将<wchar.h>定义为NULL0。请注意,前者是((void *) 0),而不是指针,但可以与指针进行比较,如int中所示。

通常,if (p == NULL) …旨在用于指针,而不是用于NULL值。

在大多数C实现中,将int转换为整数将产生零。但是,我没有在C标准中看到这一点。 (例如,我没有看到NULL的保证。)

答案 1 :(得分:1)

  

什么类型是NULL?

简答:NULL的类型为void*intlongunsigned,...

添加@Eric Postpischil精细答案,指出更多编码陷阱。

  

(宏)NULL扩展为实现定义的空指针常量。 C11dr§7.193

     

值为0的整型常量表达式,或类型为void *的表达式,称为空指针常量。 §6.3.2.33

NULL类型有很多可能性给出“整数常量”。可饮用代码不应该采用特定类型。 NULL最适合用于指针上下文。

// Poor code as NULL may not match the type of the specifier - undefined behavior
printf("%p\n", NULL); // poor
printf("%d\n", NULL); // poor

// Better
printf("%d\n", (int) NULL);

// Best.  NULL is best used in a pointer context, print as a pointer
printf("%p\n", (void *) NULL);