所以我想检查我的结构是否为空。我将我的结构声明为变量,但不要分配内存。
text* t;
稍后我想用if语句检查我的结构是否为空。
由于if (t!=NULL)
有地址,t
似乎不起作用。做if (t->head != NULL)
这样的事情会给我一个段错误,因为我还没有为结构分配任何内存。
我一旦声明malloc
,我就不想t
。有没有办法检查我的结构是否为空?
提前致谢!
答案 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
}
这可能就是你所说的“结构是空的”。但是,结构的指针 无效(“指向无处”)。对于一些更高级的数据结构,例如空指针有时是结构的同义词(例如列表)。
进一步阅读:关于空指针,声明与定义,指针和结构。