gpt4 book ai didi

c - 将指针与(无符号)-4000L 进行比较的目的

转载 作者:行者123 更新时间:2023-12-02 01:47:38 25 4
gpt4 key购买 nike

在开源组件中,cjson ,

#define is_error(ptr) ((unsigned long)ptr > (unsigned long)-4000L)

以上语句用于检查指针的有效性,如下所示

json_object* reply = json_object_new_object();
if (!reply || is_error(reply))
{
. . . //error handling
}

将指针与(unsigned long)-4000L进行比较如何验证指针的有效性?

最佳答案

这样做的原因看起来是他们使用指针值来包含“指针或错误值”。

Look here :

struct json_object* json_tokener_parse(const char *str)
{
struct json_tokener* tok;
struct json_object* obj;

tok = json_tokener_new();
obj = json_tokener_parse_ex(tok, str, -1);
if(tok->err != json_tokener_success)
obj = error_ptr(-tok->err); // <<<<<---
json_tokener_free(tok);
return obj;
}

该函数返回一个特殊值作为指针。 err_ptr macro返回错误代码的负数,大概是因为作者假设这永远不会是有效的指针地址。

Here is a test演示了宏的预期用法,即格式错误的 JSON。

 new_obj = json_tokener_parse("{ foo }");
if(is_error(new_obj)) printf("got error as expected\n");

因此,使用该特殊值的原因是它们可以保存“指向结构的指针或错误代码”。这也可以通过 union 或结构或其他方式来完成,但他们选择这样做。

关于c - 将指针与(无符号)-4000L 进行比较的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22908780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com