我想知道在C语言中NULL是什么类型。这可能是一个重复的问题,但是我在搜索时一直得到有关void类型的信息。也许更好的方式是,NULL是否可以作为任何类型函数的返回值?例如:
int main(){
dosomething();
return NULL;
}
这个可以工作吗?
NULL
的类型可以是整数类型或void *
。这是因为C标准允许它被定义为整数常量表达式或强制转换为void *
的结果。<locale.h>
、<stddef.h>
、<stdio.h>
、<stdlib.h>
、<string.h>
、<time.h>
或<wchar.h>
,NULL
“扩展为实现定义的空指针常量”。void *
”。NULL
定义为以下任何一种:0
,其类型为int
,
- ((void *) 0)
,其类型为void *
,或者
- (1+5-6)
,它是一个值为0且类型为int
的整数常量表达式。NULL
可能具有整数类型,也可以将其与指针进行比较和分配,例如:if (p == NULL) …
。这些操作的规则是将整数常量零转换为适当的指针类型进行操作。NULL
可能被定义为0
,但它旨在用于指针,而不是作为整数零。程序应避免这样做,C实现通常最好将其定义为((void *) 0)
,以帮助避免可能被接受为整数值的错误。在大多数C实现中,将NULL
转换为整数会产生零。然而,在C标准中并不保证这一点。允许(int)NULL
或(uintptr_t)NULL
会产生某些特殊的“不使用”位置的地址,而不是零。即使(int)(void*)0
也可能产生这样的地址,而不是零。int
变量x
,那么(void*)x
不能保证产生一个空指针,即使x
的值为零。void *
。 - Brave Sir Robinstddef.h
或其他标准头文件中定义了该宏。 - ouahs
是否为空字符串,我是否可以合理地确信,假如我有strlen
的访问权限,当s
某种方式为NULL时,if(s && strlen(s) == 0)return true;
不会返回true?或者必须首先显式检查s != NULL
吗? - Blake Schwartzs
是NULL
,则s && strlen(s)
的值为假,并且不会计算strlen
。因此,没有必要进行预先测试。 - Eric PostpischilNULL的类型是什么?
简短回答:NULL的类型是void*
或者int
、long
、unsigned
等。
除了@Eric Postpischil提出的编程陷阱外,还需要补充一些内容。
(宏)
NULL
扩展为一个实现定义的空指针常量。C11dr §7.19 3一个整数常量表达式,其值为0,或将这样的表达式强制转换为类型
void *
,称为空指针常量。§6.3.2.3 3
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);
NULL
的不良使用列表中,我想要加上对字符串零终止的使用。我在Stack Overflow看到很多例子中,有人使用NULL
而非0
、'\0'
、0x0
等进行零终止。 - HAL9000
NULL
。你可能正在使用类似于#define NULL 0
的东西,这应该能解决你的问题。 - SLaksvoid *
表示空指针,即#define NULL ((void *)0)
。而在C++中,表示空指针只需使用0
即可。 - Paul Rint
不是指针。 - Robert Harvey