【问题标题】:How to check if the internal typedef struct of a typedef struct is NULL?如何检查 typedef 结构的内部 typedef 结构是否为 NULL?
【发布时间】:2010-04-21 18:02:28
【问题描述】:
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-&gt;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

};

【问题讨论】:

  • 毫无意义。 tableA 不能是 NULL。字段 tableA 具有 Inner_t 类型。 Inner_t 是一个结构,而不是一个指针。将结构对象与NULL 进行比较毫无意义,这是编译器告诉你的。解释你想要做什么。
  • 我理解你的观点 AndreyT。我知道编译器告诉我我不能将结构对象与 NULL 进行比较,因为它不是指针。看,我需要检查 Outer_t 结构中的 tableA 是否为空/NULL 或尚未定义或不存在(无论正确的术语是什么),然后使用 tableB。仅此而已。还有第二种选择。即制作“Inner_t *tableA;”在 Outer_t. 但是我怎么能用 tableA empty/NULL 实例化 outer_instance ...
  • 如果 tableA 是 Inner_t *tableA,你可以将它初始化为 NULL,就像你现在的代码一样。

标签: c struct pointers typedef


【解决方案1】:

在您的代码中,初始化

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

无效。您正在尝试将NULL 分配给非指针类型Inner_tOuter_t.tableANULL 只能分配给指针。

大多数 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”(除了指针之外没有任何意义)。定义了成员的结构永远不会是“空的”。

现在,tableAtableB 是否已初始化是一个有效的问题。没有普遍适用的方法来做到这一点。一种方法是在声明时用某个预定义值填充整个结构,并检查该值是否存在作为结构尚未初始化的标志。然而,这假设在该结构中存在一个您永远不应将其视为有效数据的值;很多时候,这样的值是不存在的。

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

编辑: 查看更新后的代码,您似乎遇到了该特定错误,因为您试图将Items_t 类型的对象分配给Items_t* 类型的字段。在此处使用&amp;items_instance,您的错误应该会消失(前提是items_instance 定义在之前 outer_instance,并且items_instance 的所有元素都可以在编译时确定)。

【讨论】:

    【解决方案2】:

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

    您想将该字段设置为items_instance地址,因此请使用&amp;items_instance

    【讨论】:

      【解决方案3】:

      试试if ( tmp-&gt;tableA.table== NULL )

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-21
        • 1970-01-01
        • 1970-01-01
        • 2011-10-04
        相关资源
        最近更新 更多