2017-05-10 50 views
0

我得到一个赛格故障当我尝试从我的JSON得到val的结果文件中的其他取值,如果我行注释掉分段故障解析JSON-C

/*parseText(obj, "val", &tmp); 
strcpy (test.val, tmp); 
printf("val = %s\n", test.val); */ 

这是返回精只有一个不是我认为我处理不正确的整数。

这是我的代码和json文件如下。

#include "stdio.h" 
#include "string.h" 
#include "json-c/json.h" 

typedef struct __attribute__ ((packed)) 
{ 
    char val[4]; 
    uint32_t fetch_1; 
    uint32_t fetch_2; 
    uint32_t fetch_3; 
    uint32_t fetch_4; 
    uint32_t fetch_5; 
} 
TEST; 

static int parseText(struct json_object *new_obj, const char *field, 
         void *val) 
{ 
    struct json_object *o = NULL; 
    json_type type; 
    int ret = 0; 

    if (!json_object_object_get_ex(new_obj, field, &o)) 
     printf("Field %s does not exist\n", field); 

    type = json_object_get_type(o); 

    switch (type) { 
    case json_type_null: 
     printf("Return type is NULL\n"); 
     ret = -1; 
     break; 
    case json_type_boolean: 
     *((int *)(val)) = json_object_get_boolean(o); 
     break; 
    case json_type_double: 
     *((double *)(val)) = json_object_get_double(o); 
     break; 
    case json_type_int: 
     *((int *)(val)) = json_object_get_int(o); 
     break; 
    case json_type_string: 
     val = (char *)json_object_get_string(o); 
     break; 
    case json_type_object: 
    case json_type_array: 
     ret = -1;; 
     break; 
    } 
    return ret; 

} 
static inline int parsing(struct json_object *obj) { 
    char* tmp = NULL; 
    TEST test; 
    memset(&test, 0, sizeof(test)); 

    parseText(obj, "val", &tmp); 
    strcpy (test.val, tmp); 
    printf("val = %s\n", test.val); 
    parseText(obj, "fetch 1", &test.fetch_1); 
    printf("fetch_1= %d\n", test.fetch_1); 
    parseText(obj, "fetch 2", &test.fetch_2); 
    printf("fetch_2= %d\n", test.fetch_2); 
    parseText(obj, "fetch 3", &test.fetch_3); 
    printf("fetch_3= %d\n", test.fetch_3); 
    parseText(obj, "fetch 4", &test.fetch_4); 
    printf("fetch_4= %d\n", test.fetch_4); 
    parseText(obj, "fetch 5", &test.fetch_5); 
    printf("fetch_5= %d\n", test.fetch_5); 

    return 0; 
} 

char* file_read (const char* filename) { 
    FILE* fp; 
    char* buffer; 
    long fsize; 

    /* Open the file */ 
    fp = fopen (filename, "r"); 

    if (fp == NULL) 
    { 
     return NULL; 
    } 

    /* Get the size of the file */ 
    fseek (fp, 0, SEEK_END); 
    fsize = ftell (fp) + 1; 
    fseek (fp, 0, SEEK_SET); 

    /* Allocate the buffer */ 
    buffer = calloc (fsize, sizeof (char)); 

    if (buffer == NULL) 
    { 
     fclose (fp); 
     return NULL; 
    } 

    /* Read the file */ 
    fread (buffer, sizeof (char), fsize, fp); 

    /* Close the file */ 
    fclose (fp); 

    /* Return the buffer */ 
    return buffer; 
} 

int main (int argc, char *argv[]) 
{ 
    struct json_object *jsonObj; 
    int i = 0; 

    char* file = file_read(argv[1]); 

    jsonObj = json_tokener_parse(file); 

    for(i = 0; i < json_object_array_length(jsonObj); i++) { 
     json_object *obj = json_object_array_get_idx(jsonObj, i); 
     parsing(obj); 
    } 

    return 0; 
} 

这里是JSON文件:

[{ 
    "val": "fpr", 
    "fetch 1": 100, 
    "fetch 2": 200, 
    "fetch 3": 300, 
    "fetch 4": 400, 
    "fetch 5": 500 
}, { 
    "val": "mpr", 
    "fetch 1": 445, 
    "fetch 2": 223, 
    "fetch 3": 1089, 
    "fetch 4": 432, 
    "fetch 5": 34400 
}] 
+0

您的调试方法有点粗糙。确保使用包含调试符号的程序构建程序,并在调试器(如gdb)中运行它。这将允许你捕捉段错误,准确地找到它出现的位置,并检查所涉及的变量的值以确定近端原因。 –

回答

3

之所以在球场上"val"您parseText失败是 -

val = (char *)json_object_get_string(o); 

这改变了局部变量val。这不会影响来自调用者的tmp。

你需要的是

*(char**) val = (char*) json_object_get_string(o); 

这将改变tmp的点由json_object_get_string返回的字符串。

对于您的情况tmpNULL,并且您正尝试复制NULL之后那是未定义行为并且还导致SEG FAULT。