如何检查typedef结构的内部typedef结构是否为NULL?

时间:2010-04-21 18:02:29

标签: c struct pointers typedef

typedef struct
{   
   uint32 item1;
   uint32 item2;
   uint32 item3;
   uint32 item4;

   <some_other_typedef struct> *table;

} Inner_t;

typedef struct
{
   Inner_t tableA;

   Inner_t tableB;

} Outer_t;

Outer_t outer_instance =
{
   {NULL},
   {
    0,
    1,
    2,
    3,

    table_defined_somewhere_else,
   }
};

我的问题是如何检查tableA是否为NULL,就像outer_instance的情况一样。

尝试过:  if ( tmp->tableA == NULL )。我得到“错误:无效操作数到二进制==”

/ ****************************编辑:更新的代码在************之下***************** /

我根据bta的建议更改了代码,但现在我又收到了另一个错误 “错误:初始化元素不是常量”位于NULL(在items_instance)

之下的行
typedef struct
{   
   uint32 item1;
   uint32 item2;
   uint32 item3;
   uint32 item4;

} Items_t;

typedef struct
{
   Items_t *itemsA;

   Items_t *itemsB;

} Outer_t;


Items_t items_instance=
{   
   1,
   2,
   3,
   4
};

Outer_t outer_instance=
{
   NULL,
   items_instance

};

3 个答案:

答案 0 :(得分:3)

在您的代码中,初始化

Outer_t outer_instance = {
   {NULL},
   {
    0,
    1,
    2,
    3,
    table_defined_somewhere_else,
   }
};

无效。您正尝试将NULL分配给Outer_t.tableA,这是非指针类型Inner_tNULL只能分配给指针。

大多数C编译器将NULL定义为0((void*)0)。根据您的编译器,可以允许此语法 ,但会扩展为0,从而有效地将第一个Inner_t结构中的所有字段设置为零。无论如何,这段代码不会做我认为你会相信的。

tableA未定义或不存在的概念是错误的。由于您的结构当前已定义,声明类型为Outer_t的对象将自动创建两个Inner_t对象作为结构成员(并且那些Inner_t结构将自动创建它们由其组成的对象等)。如果存在outer_instance,则保证outer_instance.tableAouter_instance.tableB存在。它们不能“未定义”(它们是在定义Outer_t数据类型时定义的)或“NULL”(除了指针之外没有任何意义)。定义成员的结构永远不会“空”。

现在,无论tableA还是tableB是否已初始化,都是一个有效的问题。没有普遍适用的方法来做到这一点。一种方法是在声明时用一些预定义的值填充整个结构,并检查该值是否存在,表明结构尚未初始化。但是,这假定存在一个您永远不应该在该结构中看作有效数据的值;很多时候,这样的价值不存在。

如果您想以Outer_t的成员可能存在或不存在的方式构建代码,那么您应该使用指针(例如Inner_t* tableA)作为{{1}的成员而不是结构。这样,您可以将指针NULL指示为不存在的表。但是,您将无法以当前的方式与外部结构同时声明内部结构的内容。

修改 查看更新的代码,您似乎收到了该特定错误,因为您尝试将类型为Outer_t的对象分配给类型为Items_t的字段。在此处使用Items_t*,您的错误应该消失(前提是&items_instanceitems_instance之前定义了,并且outer_instance的所有元素都可以在编译时间。)

答案 1 :(得分:0)

尝试if ( tmp->tableA. table == NULL )

答案 2 :(得分:0)

在修订后的代码中,您将outer_instance的第一个字段设置为NULL,但尝试直接将第二个字段设置为items_instance。由于该字段的类型为Items_t*,但items_instance的类型为Items_t,因此您会收到类型错误。

您希望将字段设置为items_instance地址,因此请使用&items_instance