如何检查结构在 C 或 C 中是否为 NULL

新手上路,请多包涵

我有以下结构

typedef struct
{
   char      data1[10];
   char      data2[10];
   AnotherStruct  stData;
}MyData;

出于某种原因,实现者选择不将 stData 作为指针,所以我必须忍受它。我的问题是如何检查 stData 成员是否为空?因为如果它是空的,我需要跳过我的代码中的某些内容。

任何帮助表示赞赏

原文由 user2101801 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

您需要一些方法来标记 AnotherStruct stData 为空。

  • 首先检查(或仔细检查)与 AnotherStruct 相关的文档和评论,可能会询问制作它的人是否可用,以了解是否有官方方法可以做你想做的事。

  • 也许该结构有一个指针,如果它是空指针,则该结构为空。或者也许有一个整数字段,其中 0 或 -1 或其他东西可能意味着空。甚至是一个布尔字段来标记它为空。

  • 如果没有上述任何一项,也许您可以添加这样一个字段,或者对某个字段进行这样的解释。

  • 如果上述方法失败,请在 MyData 中添加一个布尔字段,以判断 stData 是否为空。

  • 您还可以解释 data1 和/或 data2 的一些值(如空字符串?充满 0xFF 字节?),表示为空 stData

  • 如果您无法修改或重新解释任一结构的内容,那么您可以将空项目和非空项目放在不同的容器中(数组、列表,无论您拥有什么)。如果 MyData 项目是从堆中一一分配的,那么这本质上与拥有 一个空闲列表 相同。

  • 上述变化,如果您在一个容器中混合了空和非空项目,那么您可以拥有另一个容器,其中包含指向非空项目(或空项目,或任何适合您的需要)的 指针 或索引.这有一个额外的复杂性,您需要保持两个容器同步,这可能是微不足道的,也可能不是微不足道的。

原文由 hyde 发布,翻译遵循 CC BY-SA 3.0 许可协议

我发现自己与您(做过)类似的修复。我需要对给定的结构进行打包,并且知道结构中的确切字节数将有助于我序列化结构。但是,某些结构是空的,因此序列化无法对齐确切的字节数。

虽然这是 3 年后,但我找到了以下对我有用的解决方案:

 template <typename T> struct is_empty {
    struct _checker: public T { uint8_t dummy; };
    static bool const value = sizeof(_checker) == sizeof(T);
};

结果可以查询为 is_empty<T>::value 并且在编译时可用。

 template <typename S>
typedef union {
    struct __attribute__((__packed__)) {
        ObjId   id;
        S       obj;
    } dataStruct;
    std::array<uint8_t, (sizeof(dataStruct) - is_empty<S>::value)> byteArray;
} _msg_t;

以下是参考资料:

原文由 sirajissani 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题