首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中的Json解析和字符串管理

C语言中的Json解析和字符串管理
EN

Stack Overflow用户
提问于 2015-08-26 22:03:40
回答 1查看 561关注 0票数 0

考虑以下功能:

代码语言:javascript
复制
int get_timestamp(json_object *json_obj, double *timestamp) {
    json_object *value_obj;
    int status;
    if (json_object_object_get_ex(json_obj, "timestamp", &value_obj)) {
        if (json_object_is_type(value_obj, json_type_double)) {
            *timestamp = json_object_get_double(value_obj);
            status = JSONPARSER_OK;
        }
        else
            status = JSONPARSER_EBADTYPE;
    } else
        status = JSONPARSER_ENODENOTFOUND;
    free(value_obj);
    return status;
}

int get_display_name(json_object *json_obj, char **display_name) {
    json_object *value_obj;
    int status;
    const char* holder;
    if (json_object_object_get_ex(json_obj, "display_name", &value_obj)) {
        if (json_object_is_type(value_obj, json_type_string)) {
            // The returned string memory is managed by the json_object and will
            // be freed when the reference count of the json_object drops to zero.
            holder = json_object_get_string(value_obj);
            strcpy(*display_name, holder);
            status = JSONPARSER_OK;
        }
        else
            status = JSONPARSER_EBADTYPE;
    } else
        status = JSONPARSER_ENODENOTFOUND;
    free(value_obj);
    return status;
}

int get_organization(json_object *json_obj, char **organization) {
    json_object *value_obj;
    int status;
    const char* holder;
    if (json_object_object_get_ex(json_obj, "organization", &value_obj)) {
        if (json_object_is_type(value_obj, json_type_string)) {
            // The returned string memory is managed by the json_object and will
            // be freed when the reference count of the json_object drops to zero.
            holder = json_object_get_string(value_obj);
            strcpy(*organization, holder);
            status = JSONPARSER_OK;
        }
        else
            status = JSONPARSER_EBADTYPE;
    } else
        status = JSONPARSER_ENODENOTFOUND;
    free(value_obj);
    return status;
}

用作:

代码语言:javascript
复制
json_object *response_obj, *idp_obj;
int status;
char *display_name;
char *organization;
response_obj = json_tokener_parse(raw_data);
json_object_object_get_ex(response_obj, "idp", &idp_obj);

get_timestamp(response_obj, timestamp);
get_display_name(idp_obj, &display_name);
get_organization(idp_obj, &organization);

free(idp_obj);
free(response_obj);
return status;

会发生什么:

1)删除get_organization(idp_obj, &organization);后,一切似乎都很正常;

2)移除get_display_name(idp_obj, &display_name);后,一切似乎都恢复正常;

3)在代码“原样”的情况下,在get_organization方法内部使用的strcpy上存在错误

代码语言:javascript
复制
No source available for "__strcpy_sse2_unaligned() at 0x7ffff763f001" 

我真的很想理解这种行为,以便提高我在这种令人惊叹但很难的语言中的知识。

EN

回答 1

Stack Overflow用户

发布于 2015-08-26 22:17:00

该错误消息是调试器错误消息,因为它位于无法定位源代码的函数中。您唯一需要做的就是遍历函数调用堆栈,直到到达您的代码。

至于为什么调试器在该函数中停止,这实际上应该是另一个问题,但我无论如何都会回答它:这是因为未定义的行为,因为您传递给它的目标指针是一个未初始化的局部变量:display_name。在调用get_display_name的代码中,您声明了局部变量display_name,但没有初始化它。未初始化的非静态局部变量的值是不确定的,在没有初始化的情况下使用它们会导致未定义的行为。

对于这个问题,基本上有两种解决方案:要么将display_name声明为固定大小的数组,要么使用malloc使其指向有效的已分配内存。

使用organization变量也会遇到同样的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32228886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档