如果我在.h中声明一个指向结构的指针,例如:
my_struct_t *ptr;
...然后我在代码中检查if(ptr==NULL)
,而没有实际将ptr设置为NULL或为它分配内存,我可以检查它是否等于NULL吗?
基本上我要问的是,通过在.h中使用ptr,它是自动设置为NULL,还是我必须这样做?
谢谢, 赫里斯托斯
revisiont:这是在C
中完成的答案 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文件中创建任何分配或代码。