当我们使用“if(ptr==NULL)”来检查整型指针ptr是否为NULL指针时,NULL指针会隐式转换为(int*)类型吗?

3
我知道一个空指针是(void*)0。但是当我们使用以下语句时会发生什么:
  if(ptr==NULL)

指针ptr可以是charfloatint类型的指针。在这种情况下,NULL是否保证会像在C语言中malloc()函数返回的void*类型一样隐式转换为左侧的类型?


strpbrk 的意思是“字符串指针中断”。 - Raghu Srikanth Reddy
这个链接可能会回答你的问题。请查看被选中的答案。 - Suvarna Pattayil
最后,NULL 不一定是“(void*)0”。在某些平台上(如Darwin!),它只是普通的“0”。要小心。特别是,永远不要做“printf("%p",NULL)”或“system("thingy",NULL)”,因为它们将无法工作。 - Nicholas Wilson
3个回答

6
“NULL”是否保证隐式转换为左侧的类型?
是的。
根据ISO/IEC 9899:2011 C编程语言标准的6.3.2.3.4节:
将空指针转换为另一个指针类型会产生该类型的空指针。任何两个空指针都应相等。
以及6.3.2.3.1节:
指向void的指针可以转换为任何对象类型的指针,反之亦然;结果应与原始指针相等。

2
我知道一个NULL指针是(void*)0
不一定。宏NULL可以被定义为0(void*)0或其他内容。唯一的要求是它与特定实现的空指针兼容。理论上,编译器可能将NULL定义为1,但在实践中没有人这样做。
NULL是否保证隐式转换为左侧的类型?
是的,在使用空指针与其他类型的指针一起使用的任何表达式都会产生空指针。这与某些实现将NULL定义为(void*)无关。C标准仅保证空指针转换,而不管NULL宏。
在C中,malloc()返回的类型是void *,但会隐式转换为lvalue的类型吗?
是的,在C中,void*始终会被隐式转换为/从另一种类型的指针(在C++中,您需要进行显式转换)。

0

魔法发生在 (void*) 部分。Void 指针可以指向 任何 东西。因此将任何指针与 NULL 进行比较都是可以的。


1
C标准规定void *必须与任何其他指针类型兼容,如果你的编译器遵循这个标准,你就不用担心使用void指针进行赋值和比较。 - Jonatan Goebel
1
NULL并不一定是(void*)0,因此要严谨和正式,这个答案是不正确的。 - Lundin
@Lundin 您是正确的,但另一方面它必须与所有指针类型兼容,这基本上意味着它必须是 void* - Some programmer dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接