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
};
答案 0 :(得分:3)
在您的代码中,初始化
Outer_t outer_instance = {
{NULL},
{
0,
1,
2,
3,
table_defined_somewhere_else,
}
};
无效。您正尝试将NULL
分配给Outer_t.tableA
,这是非指针类型Inner_t
。 NULL
只能分配给指针。
大多数C编译器将NULL
定义为0
或((void*)0)
。根据您的编译器,可以允许此语法 ,但会扩展为0
,从而有效地将第一个Inner_t
结构中的所有字段设置为零。无论如何,这段代码不会做我认为你会相信的。
tableA
未定义或不存在的概念是错误的。由于您的结构当前已定义,声明类型为Outer_t
的对象将自动创建两个Inner_t
对象作为结构成员(并且那些Inner_t
结构将自动创建它们由其组成的对象等)。如果存在outer_instance
,则保证outer_instance.tableA
和outer_instance.tableB
存在。它们不能“未定义”(它们是在定义Outer_t
数据类型时定义的)或“NULL”(除了指针之外没有任何意义)。定义成员的结构永远不会“空”。
现在,无论tableA
还是tableB
是否已初始化,都是一个有效的问题。没有普遍适用的方法来做到这一点。一种方法是在声明时用一些预定义的值填充整个结构,并检查该值是否存在,表明结构尚未初始化。但是,这假定存在一个您永远不应该在该结构中看作有效数据的值;很多时候,这样的价值不存在。
如果您想以Outer_t
的成员可能存在或不存在的方式构建代码,那么您应该使用指针(例如Inner_t* tableA
)作为{{1}的成员而不是结构。这样,您可以将指针NULL指示为不存在的表。但是,您将无法以当前的方式与外部结构同时声明内部结构的内容。
修改强>
查看更新的代码,您似乎收到了该特定错误,因为您尝试将类型为Outer_t
的对象分配给类型为Items_t
的字段。在此处使用Items_t*
,您的错误应该消失(前提是&items_instance
在 items_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
。