如何检查初始化的结构是否为空?
How to check if an initialised struct is empty or not?
所以我想检查我的结构是否为空。我将我的结构声明为变量但不分配内存。
text* t;
稍后我想用 if 语句检查我的结构是否为空。
if (t!=NULL)
似乎不起作用,因为 t
有地址。还做类似 if (t->head != NULL)
的事情会给我一个段错误,因为我没有为结构分配任何内存。
我不想malloc
一声明就t
。有没有办法检查我的结构是否为空?
提前致谢!
只需确保将指针初始化为 NULL
:
text* t = NULL;
然后您可以根据需要malloc
,例如:
if (t == NULL)
{
t = malloc(sizeof *t);
// NB: check for error here - malloc can fail!
}
t->head = foo;
简单地初始化定义的指针
text* t = NULL;
在这种情况下,您可以检查是否分配了指针应该指向的对象
if ( t != NULL ) { /* some action */ }
或者你可以写
if ( t && t->head ) { /* some action */ }
请注意,如果指针是在任何函数外部定义的,即如果它具有静态存储持续时间,则编译器会将其隐式初始化为空指针常量。
您不是声明结构,而是指向结构的指针。您甚至 定义 指针(将其带入生活并为其保留内存 space)。
声明(并定义)该结构的变量(假设它已经在某处使用 typedef 声明):
text my_struct_var;
这将在编译时保留space。在调用 main() 之前,运行 时间系统将结构初始化为 0(这也可能由加载程序的 OS 函数完成)。这意味着所有字段都设置为 0。
如果您坚持使用指针方法,则首先必须 malloc()
("memory allocate") 此类对象(或此类对象的数组)所需的 space 和将其分配给指针。此分配称为 "dynamic",因为内存是在程序控制下的 运行 时间分配的。类似的,它可以被程序代码 free()
d 之后必须 永远不会 再次访问。
分配的内存未初始化,因此将有随机数据。因此,您无法测试其中的任何内容。
动态内存分配的一个主要问题是它可能会失败(没有可用的内存)。因此,如果返回了有效指针,则始终必须检查 malloc()
的结果:
text *my_text_struct_ptr = malloc(sizeof(text));
if ( my_text_struct_ptr == NULL ) {
// no memory allocated treat correspondingly
// most basic reaction: exit(1) the program immediately
}
这可能就是你所说的 "the struct is empty"。但是,指针 指向无效 ("points to nowhere") 的结构。对于一些更高级的数据结构,例如 空指针 有时是结构为空的症状(例如列表)。
进一步阅读:关于空指针、声明与定义、指针和结构。
所以我想检查我的结构是否为空。我将我的结构声明为变量但不分配内存。
text* t;
稍后我想用 if 语句检查我的结构是否为空。
if (t!=NULL)
似乎不起作用,因为 t
有地址。还做类似 if (t->head != NULL)
的事情会给我一个段错误,因为我没有为结构分配任何内存。
我不想malloc
一声明就t
。有没有办法检查我的结构是否为空?
提前致谢!
只需确保将指针初始化为 NULL
:
text* t = NULL;
然后您可以根据需要malloc
,例如:
if (t == NULL)
{
t = malloc(sizeof *t);
// NB: check for error here - malloc can fail!
}
t->head = foo;
简单地初始化定义的指针
text* t = NULL;
在这种情况下,您可以检查是否分配了指针应该指向的对象
if ( t != NULL ) { /* some action */ }
或者你可以写
if ( t && t->head ) { /* some action */ }
请注意,如果指针是在任何函数外部定义的,即如果它具有静态存储持续时间,则编译器会将其隐式初始化为空指针常量。
您不是声明结构,而是指向结构的指针。您甚至 定义 指针(将其带入生活并为其保留内存 space)。
声明(并定义)该结构的变量(假设它已经在某处使用 typedef 声明):
text my_struct_var;
这将在编译时保留space。在调用 main() 之前,运行 时间系统将结构初始化为 0(这也可能由加载程序的 OS 函数完成)。这意味着所有字段都设置为 0。
如果您坚持使用指针方法,则首先必须 malloc()
("memory allocate") 此类对象(或此类对象的数组)所需的 space 和将其分配给指针。此分配称为 "dynamic",因为内存是在程序控制下的 运行 时间分配的。类似的,它可以被程序代码 free()
d 之后必须 永远不会 再次访问。
分配的内存未初始化,因此将有随机数据。因此,您无法测试其中的任何内容。
动态内存分配的一个主要问题是它可能会失败(没有可用的内存)。因此,如果返回了有效指针,则始终必须检查 malloc()
的结果:
text *my_text_struct_ptr = malloc(sizeof(text));
if ( my_text_struct_ptr == NULL ) {
// no memory allocated treat correspondingly
// most basic reaction: exit(1) the program immediately
}
这可能就是你所说的 "the struct is empty"。但是,指针 指向无效 ("points to nowhere") 的结构。对于一些更高级的数据结构,例如 空指针 有时是结构为空的症状(例如列表)。
进一步阅读:关于空指针、声明与定义、指针和结构。