C 什么类型为空?

C 什么类型为空?,c,null,C,Null,我想知道C中的Null类型是什么。这可能是重复的,但我一直在搜索中获取有关void类型的信息。也许更好的方法是可以为任何类型的函数返回NULL?例如: int main(){ dosomething(); return NULL; } 这行吗?空的类型可以是整数类型或void*。这是因为C标准允许将其定义为整数常量表达式或转换为void*的结果 C 2018 7.19 3说NULL“扩展到实现定义的空指针常量”(当包含以下任何标题时:,,,,,,或) C 6.3.2.3 3说空

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

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

这行吗?

的类型可以是整数类型或
void*
。这是因为C标准允许将其定义为整数常量表达式或转换为
void*
的结果

C 2018 7.19 3说
NULL
“扩展到实现定义的空指针常量”(当包含以下任何标题时:
,或

C 6.3.2.3 3说空指针常量是“值为0的整数常量表达式,或转换为**void***类型的表达式。”

因此,C实现可以将
NULL
定义为,例如:

int main(){
    dosomething();
    return 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
(uintpttr\t)NULL
生成某些特殊“请勿使用”位置的地址,而不是零。即使
(int)(void*)0
也可能产生这样的地址,而不是零

当一个整型常量转换为指针类型时,C实现会对其进行特殊处理;它为该实现生成空指针,即使其空指针使用的地址不是零。事实上,它是一个整数常量,这意味着编译器可以在识别源代码中的转换时应用这种特殊处理。如果我们有一些非常量表达式,例如
int
变量
x
,那么即使
x
的值为零,
(void*)x
也不能保证生成空指针

什么类型为空

简短回答:
NULL
的类型是
void*
int
long
无符号


除了精细的回答,还要指出更多的编码缺陷

(宏)
NULL
,它扩展为实现定义的NULL指针常量。C11dr§7.19 3

值为0的整型常量表达式或转换为类型
void*
的此类表达式称为空指针常量。§6.3.2.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);

int
-它在签名中
NULL
在C中不存在。您可能正在使用类似于
#define NULL 0
的东西,这应该可以回答您的问题。在C中,它通常是
void*
,即
#define NULL((void*)0)
。在C++中,它只是<代码> 0代码>代码> <代码> int >代码>不是指针。请注意,这不能保证强制转换为“代码> >空**/COD> .<代码> STDDEF.H./C>或宏定义的其他标准头。好奇,如果我有一个函数,检查输入<代码> S/<代码>是否为空字符串,我是否可以合理地确定
if(s&&strlen)==0)返回true
(假设我有权访问strlen
)如果s碰巧为空,则不会返回true?或者是否需要首先明确检查
s!=NULL
?@BlakeSchwartz:如果
s
NULL
s&&strlen
计算为false,而
strlen
不计算。没有必要进行初步测试。