如何检查 cJSON 指针是否早于 initialized/set?

How to check if a cJSON pointer was initialized/set earlier?

我有一个带有 cJSON 指针的结构,如下所示:

  struct { 

      cJSON *myJSON1;
      cJSON *myJSON2;
      ...
  } myStruct;

在我的代码中的某个地方,我创建了 cJSON 项,如 myStruct.myJSON1 = cJSON_CreateObject()

在代码的末尾,我想对分配的那些指针调用 cJSON_Delete()。我认为这是经典的 C 案例,无法确定指针是否以某种方式分配。当然,我可以保留一个标志来跟踪,但我想要一个简单的方法。我读...

cJSON 结构如下:

  /* The cJSON structure: */
  typedef struct cJSON
  {
      struct cJSON *next;
      struct cJSON *prev;
      struct cJSON *child;
      int type;
      char *valuestring;
      /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
      int valueint;
      double valuedouble;
      char *string;
  } cJSON;

函数cJSON_Invalid()可用。文档指出“(检查 cJSON_IsInvalid):表示不包含任何值的无效项目。如果将项目设置为全零字节,则自动具有此类型。”我必须将结构 memset 为 0 还是只键入?

换句话说,我的问题是:在不创建额外变量的情况下检查 cJSON 指针是否被分配的最简单方法是什么?也许将 "type" 设置为零?我可以尝试这些选项,但我想要一个适用于所有情况的明确答案。

如果您只有一个指向 cJSON 数据结构的未初始化指针,则行为未定义。 IE。对于 cJSON *myJSON1;

cJSON_Invalid(myJSON1) 可能 return 01.

cJSON_Delete(myJSON1)可能会出现段错误。或者运气好的话什么也不做。

解决方案是始终将 cJSON 数据结构初始化为 NULL。 然后你可以调用cJSON_Delete()。如果指针仍然是 NULL 则调用将不执行任何操作。如果它是在您的程序中的某个时刻设置的,它将正确释放所有内存。 由于您有一个包含多个 cJSON 指针的结构,您可以使用 memset 将整个数据结构设置为 0

你可以看看source code

CJSON_PUBLIC(void) cJSON_Delete(cJSON *item)
{
    cJSON *next = NULL;
    while (item != NULL)
    {
    ...
    }
}