我想知道C中的Null是什么类型。这可能是重复的,但我一直在搜索中获取有关void类型的信息。也许更好的方法是可以为任何类型函数返回NULL吗?例如:
int main(){
dosomething();
return NULL;
}
这有用吗?
答案 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>
定义为NULL
或0
。请注意,前者是((void *) 0)
,而不是指针,但可以与指针进行比较,如int
中所示。
通常,if (p == NULL) …
旨在用于指针,而不是用于NULL
值。
在大多数C实现中,将int
转换为整数将产生零。但是,我没有在C标准中看到这一点。 (例如,我没有看到NULL
的保证。)
答案 1 :(得分:1)
什么类型是NULL?
简答:NULL
的类型为void*
或int
,long
,unsigned
,...
添加@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);