C中的空指针

时间:2015-12-22 17:31:07

标签: c pointers

我想初始化一个函数指针,使其为null。这两种方式中哪一种更受欢迎?

void (*Pointer)(void) = NULL;

void (*Pointer)(void) = (void (*)(void))0;

3 个答案:

答案 0 :(得分:3)

0可隐式转换为任何指针类型。虽然编译器实现NULL的方式取决于。

在您的代码中,您只需编写

即可

void (*Pointer)(void) = 0;但它不可移植,请写void (*Pointer)(void) = NULL;

答案 1 :(得分:2)

标准(ISO / IEC 9899:2011)说:

  

§6.3.2.3指针

     

¶1指向void的指针可以转换为指向任何对象类型的指针。指向任何对象类型的指针可以转换为指向void并再次返回的指针;结果应该等于原始指针。

     

¶2对于任何限定符 q ,指向非 q - 限定类型的指针可能会转换为指向 q 的指针 - 该类型的合格版本;存储在原始指针和转换指针中的值应相等。

     

¶3值为0的整型常量表达式,或者类型为void *的表达式,称为空指针常量 66)如果将空指针常量转换为指针类型,则保证将结果指针(称为空指针)与不等于指向任何对象或函数的指针进行比较。

     

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

     

...

     

¶8指向一种类型函数的指针可以转换为指向另一种类型函数的指针,然后再返回;结果应该等于原始指针。如果转换的指针用于调用类型与引用类型不兼容的函数,则行为未定义。

     

66)NULL<stddef.h>(和其他标头)中定义为空指针常量;见7.19。

     

§7.19通用定义<stddef.h>

     

¶3宏是

     

NULL

     

扩展为实现定义的空指针常量; ...

所有这些加起来说,问题中使用的任何一种符号都是有效的,而且它们(和其他类似的表达式)是等价的,并且没有问题。

void (*Pointer)(void) = NULL;
void (*Pointer)(void) = (void (*)(void))0;
void (*Pointer)(void) = 0;

请注意,标准没有明确说明您可以将指向对象类型的指针转​​换为指向函数类型的指针,反之亦然,或者保证可以使用往返。请记住,曾经存在早期Intel机器的内存模型,其中数据(对象)指针与函数指针的大小不同 - 并且仍然可以在其他机器上发生(IBM AS / 400及其继承者和后继者是另一个例子)。 p>

您还可以null pointerhttp://c-faq.com/开始研究问题和答案。

答案 2 :(得分:1)

NULL被定义为空指针常量。空指针常量可用于将任何指针(数据指针或函数指针)初始化为正确类型的空指针,因此分配NULL就可以了。

0也可以工作,因为0也是一个空指针常量。那么0L,(13 * 12-156)和许多其他方式。 NULL是首选,因为它显示了分配空指针的意图。

下面这一行只是不必要的工作。