.h中的指针是否自动设置为NULL?

时间:2010-02-20 21:43:38

标签: c pointers

如果我在.h中声明一个指向结构的指针,例如:

my_struct_t *ptr;

...然后我在代码中检查if(ptr==NULL),而没有实际将ptr设置为NULL或为它分配内存,我可以检查它是否等于NULL吗?

基本上我要问的是,通过在.h中使用ptr,它是自动设置为NULL,还是我必须这样做?

谢谢, 赫里斯托斯

revisiont:这是在C

中完成的

6 个答案:

答案 0 :(得分:4)

来自K& R2nd:

  

由于缺乏显式初始化,外部和静态变量可以保证初始化为零。

所以,是的。

这似乎是1990年标准的A8.7节。不知道1999年的标准在哪里看。

答案 1 :(得分:1)

这不是一个适当的声明,你必须这样声明:

 extern my_struct_t *ptr;

在.c源代码文件中的某处实际定义它:

 my_struct_t *ptr;  

这将使其初始化为零。

答案 2 :(得分:1)

要回答您的问题,是的,它将被设置为NULL。该变量将具有全局范围,具有全局生存期的变量将初始化为NULL(对于指针)。

但是,不应将变量定义放在.h文件中。如果你包含.h文件 超过1个.c文件,您将拥有该变量的多个定义,这是不可取的。

您应该在头文件中放置一个声明,例如

extern my_struct_t *ptr;

然后在你的一个.c文件中,放置一个定义:

my_struct_t *ptr;

答案 3 :(得分:0)

全局变量自动初始化为零。请参阅my answer to another question中的案例。

请注意,在头文件中定义变量是非常糟糕的做法 - 如果多个源文件包含该标题,您将拥有重复的符号,并且无法链接该程序。最好在标头中将该变量声明为extern,并仅在一个源文件中定义它。

答案 4 :(得分:0)

头文件中的

extern struct foo* pfoo;和任何函数之外的struct foo* pfoo;个文件中的.c将获得静态存储用于指针,从而自动初始化为零。

extern限定词在这里是关键。它告诉编译器不要为每个翻译单元中的指针分配存储空间。

答案 5 :(得分:0)

以下是K& R所说的内容:

  

默认情况下,外部和静态变量初始化为零。没有显式初始化程序的自动变量具有未定义(即垃圾)值。

自动变量是在函数内声明的变量。既然你说过.h文件,你的文件可能在外面,因此是静态的。

否则,我相信您可以在声明中添加“= NULL”,因此您不必记得在其他地方执行此操作。

我尽量不在.h文件中创建任何分配或代码。