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

时间:2015-05-24 10:37:02

标签: c struct

所以我想检查我的结构是否为空。我将我的结构声明为变量,但不要分配内存。

text* t;

稍后我想用if语句检查我的结构是否为空。 由于if (t!=NULL)有地址,t似乎不起作用。做if (t->head != NULL)这样的事情会给我一个段错误,因为我还没有为结构分配任何内存。

我一旦声明malloc,我就不想t。有没有办法检查我的结构是否为空?

提前致谢!

3 个答案:

答案 0 :(得分:4)

只需确保将指针初始化为NULL

text* t = NULL;

然后您可以根据需要malloc,例如:

if (t == NULL)
{
    t = malloc(sizeof *t);
    // NB: check for error here - malloc can fail!
}
t->head = foo;

答案 1 :(得分:2)

只需初始化指针

即可
text* t = NULL;

在这种情况下,您可以检查指针应指向的对象是否已分配

if ( t != NULL ) { /* some action */ }

或者你可以写

if ( t && t->head ) { /* some action */ }

考虑到如果指针定义在任何函数之外,如果它具有静态存储持续时间,那么它会被编译器隐式初始化为空指针常量。

答案 2 :(得分:0)

声明结构,而指针声明结构。你甚至定义指针(将它带入生命并为它保留存储空间)。

声明(并定义)该结构的变量(假设它之前已使用typedef 声明):

text my_struct_var;

这将在编译时保留空间。在调用main()之前,运行时系统将结构初始化为0(这也可以由加载程序的OS函数完成)。这意味着所有字段都设置为0。

如果你坚持使用指针方法,首先必须malloc()(“内存分配”)这样一个对象(或这些对象的数组)所需的空间并将其分配给指针。此分配称为“动态”,因为在程序控制下在运行时分配了这些分配。类似地,程序代码可以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
}

这可能就是你所说的“结构是空的”。但是,结构的指针 无效(“指向无处”)。对于一些更高级的数据结构,例如空指针有时是结构的同义词(例如列表)。

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