如何检查 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 0
或 1
.
和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)
{
...
}
}
我有一个带有 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 0
或 1
.
和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)
{
...
}
}