2017-05-10 10 views
0

私が試してみて、値を他のフェッチ・ファイルの私のJSONからのvalの結果を得る私はセグメンテーションフォールト解析JSON-C

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

これはある行をコメントアウト場合は罰金戻ったとき、私はワンセグ障害を取得しています私が間違って扱っていると推測する整数ではないものの1つだけです。

ここは私のコードで、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

あなたparseTextがフィールド"val"に失敗した理由はある -

val = (char *)json_object_get_string(o); 

これは、ローカル変数valを変更します。呼び出し元からのtmpには影響しません。あなたが必要なもの

これはjson_object_get_stringによって返された文字列を指すようにtmpを変更します

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

です。

tmpNULLであり、それ以降はNULLからコピーしようとしています。これは未定義の動作であり、またSEG FAULTを引き起こしています。

関連する問題