【问题标题】:json-c parsing - error dereferencing pointer to incomplete typejson-c 解析 - 错误解引用指向不完整类型的指针
【发布时间】:2015-06-12 21:42:45
【问题描述】:

我一直在尝试使用以下代码,取自一个示例,我不得不将 json_object_object_get(struct json_object *obj, const char *key) 更改为 json_object_get_ex(struct json_object *obj, const char *key,结构 json_object **值)

很抱歉,我已经发布了类似的问题,因为我几天来一直试图找到一种从套接字解析 json 的方法,但我已经绝望了,但我做了更多的工作和研究,并且我认为这非常接近。我从编译以下得到的错误是:

server4.c:在函数“main”中: server4.c:62:错误:取消引用指向不完整类型的指针 server4.c:68: 警告:赋值使指针从整数不进行强制转换

    struct json_object *jobj, *val_jobj, *value;                                        
    char const *val;                                                              
    char buf[50];                                                                              
    fgets(buf, sizeof(buf), stdin);                                               
    printf("Input JSON : %s", buf);         
    char const *val;
    *jobj = json_tokener_parse(buf);
    if (is_error(jobj))    
    return (-1);  
    printf("Received JSON in String format : %s\n",    
    json_object_to_json_string(jobj));

  //Get the value for the key "name"      
    val_jobj = json_object_object_get_ex(jobj, "name", &value);    
    printf("Extracted value for command : %s\n",    

    //Get the string from the value of the key "name"                                         
    val = json_object_get_string(val_jobj);                                       
    printf("String value returned : %s\n", val);      

我看不出哪里出了问题,我也不完全理解 json-c 的工作原理,我也更熟悉 c++,当然我也在那里使用指针。无论哪种方式,通过阅读一些 c++ 的 json 解析器,我发现它们更容易理解。

提前致谢

【问题讨论】:

  • 你能把它分解成更容易阅读的东西吗?例如,一个较小的测试函数会出现同样的问题。
  • 编译错误在第62行。所以你需要在你的代码sn-p中输入行号或者指出哪一行是第62行。

标签: c json pointers json-c


【解决方案1】:

json_object 结构是不透明类型。它是私有的,指向它的指针不能被 json-c 库之外的代码取消引用。

json_tokener_parse 返回 json_object* 所以第 62 行应该是:

jobj = json_tokener_parse(buf);

也就是说,不要取消引用 jobj。

【讨论】:

    【解决方案2】:

    您的代码中显示的唯一取消引用是

    *jobj = json_tokener_parse(buf);
    

    所以这必须是错误消息所指的第 62 行。

    您告诉编译器获取指针 jobj 的值(您从未为其赋值,因此出现错误号 1)并在该值指向的空间中存储从json_tokener_parse(buf)。麻烦的是,你没有告诉编译器 struct json_object 是什么,所以 jobj 是一个指向不完整类型的指针——编译器不知道它有多大,也不知道它是由什么组成的。我想你忽略了一个 JSON 头文件到#include

    关于第 68 行的警告是一个单独但可能相关的问题,但第 68 行(如果我对 62 的猜测是正确的)是注释。

    【讨论】:

    • 对不起,是给*jobj = json_tokener_parse(buf);
    • 我有 #include <json/json.h> 并且我正在使用 -l json 进行编译。它是 defo 链接,因为它给了我关于以前的 get_object 函数被弃用的错误消息
    • @Alan Au 我现在无法再次检查,因为我们的微型处理器明天将在某处安装服务器程序,因此它处于脱机状态。但我相当确定我将其更改为尊重,因为在我收到关于将 int 转换为指针的错误之前,所以我认为这一定是因为我没有取消引用 *jobj = json_tokener_parse(buf) 中的变量。
    • 我不知道你的另一个错误是什么。如果您再次收到该帖子。但是你绝对不能取消引用jobj。即使您没有收到编译错误,您也会收到运行时错误。 jobj 在那一点上是未初始化的,所以你绝对不能取消引用它,不管与 json-c 有什么关系。
    猜你喜欢
    • 2020-06-12
    • 1970-01-01
    • 2018-05-31
    • 2017-11-02
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多