1

我有一个带有 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):表示不包含任何值的无效项目。如果您将项目设置为全零字节,您将自动拥有此类型。” 我必须将结构设置为 0 还是只输入?

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

4

1 回答 1

1

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

cJSON_Invalid(myJSON1)可能会返回01

并且cJSON_Delete(myJSON1)可能会出现段错误。或者,如果你幸运的话,什么也不做。

解决方案是始终将 cJSON 数据结构初始化为NULL. 然后你就可以打电话了cJSON_Delete()。如果指针仍然NULL是调用将什么也不做。如果它是在程序中的某个位置设置的,它将正确释放所有内存。由于您有一个多cJSON指针结构,您可以将整个数据结构设置为0使用 memset。

你可以看看源代码

CJSON_PUBLIC(void) cJSON_Delete(cJSON *item)
{
    cJSON *next = NULL;
    while (item != NULL)
    {
    ...
    }
}
于 2020-01-22T02:14:09.410 回答