3

我知道 NULL 指针是(void*)0. 但是当我们使用如下语句时会发生什么:

  if(ptr==NULL)

哪里ptr可以是 achar或指针?是否float保证NULL隐式转换为左侧的类型,例如,在 C 中,返回的类型is但隐式转换为左值的类型?intmalloc()void*

4

3 回答 3

6

NULL 是否保证隐式转换为左边的类型?[...]

是的。

根据ISO/IEC 9899:2011 C 编程语言标准的第 6.3.2.3.4 节:

将空指针转换为另一种指针类型会产生该类型的空指针。任何两个空指针应该比较相等。

和第 6.3.2.3.1 节

指向 void 的指针可以转换为指向任何对象类型的指针或从指向任何对象类型的指针转​​换。指向任何对象类型的指针都可以转换为指向 void 的指针并再次返回;结果应与原始指针比较。

于 2013-05-15T11:24:59.123 回答
2

我知道 NULL 指针是(void*)0

不必要。宏 NULL 可以定义为0(void*)0或其他。唯一的要求是它与特定实现的空指针兼容。理论上,编译器可以将 NULL 定义为 1,但实际上没有人这样做。

NULL是否保证隐式转换为左边的类型

是的,任何将空指针与另一种指针一起使用的表达式都会产生空指针。这与某些将 NULL 定义为 (void*) 的实现无关。无论 NULL 宏如何,C 标准只保证空指针转换。

在 C 中, malloc() 返回的类型是 void* 但隐式转换为左值的类型?

是的,在 C 中,avoid*将始终隐式转换为/从另一种类型的指针转​​换(在 C++ 中,您需要显式转换)。

于 2013-05-15T11:38:11.787 回答
0

神奇的发生是因为这(void*)部分。一个 void 指针可以指向任何东西。因此,比较任何指针NULL都可以。

于 2013-05-15T11:07:44.830 回答