如何检查初始化的结构是否为空?

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") 的结构。对于一些更高级的数据结构,例如 空指针 有时是结构为空的症状(例如列表)。

进一步阅读:关于空指针、声明与定义、指针和结构。