2016-05-23 10 views
0

jsonの文字列とプリントを読み込もうとしていますが、セグメンテーションフォルト(コアダンプ)が生成されています。私はエラーが入力文字列のbeacuseだと思うが、本当にはっきりしない。ここセグメンテーションエラーの読み込みjsonの文字列

コード

CODEです:

#include <json/json.h> 
#include <stdio.h> 

void json_parse(json_object * jobj); 

int main(){ 

char * string = "{" 
       "\"coooooool\": { " 
            "\"name\" : \"coooooooooool\"," 
            "\"name\" : 1" 
            "\"}" 
       "\"}"; 

printf ("JSON string: %sn", string); 
json_object * jobj = json_tokener_parse(string); 
json_parse(jobj); 


return 0; 
} 

void json_parse(json_object * jobj) { 
enum json_type type; 
json_object_object_foreach(jobj, key, val) { 
    type = json_object_get_type(val); 
    switch (type) 
    { 
     case json_type_int: printf("type: json_type_int, "); 
     printf("value: %dn", json_object_get_int(val)); 
     break; 
    } 
    } 
} 

私はvalgrindのと

を実行している間、私はこのエラーを取得しています適切に

をエラーをチェックするためにvalgrindのと、出力バイナリファイルを実行しました

==14573== Memcheck, a memory error detector 
==14573== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. 
==14573== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info 
==14573== Command: ./a.out 
==14573== 
==14573== Invalid read of size 4 
==14573== at 0x40491F8: json_object_get_object (in /usr/lib/i386-linux-gnu/libjson.so.0.0.1) 
==14573== by 0x80485E5: main (in /var/www/json/a.out) 
==14573== Address 0xfffffff5 is not stack'd, malloc'd or (recently) free'd 
==14573== 
==14573== 
==14573== Process terminating with default action of signal 11 (SIGSEGV) 
==14573== Access not within mapped region at address 0xFFFFFFF5 
==14573== at 0x40491F8: json_object_get_object (in /usr/lib/i386-linux-gnu/libjson.so.0.0.1) 
==14573== by 0x80485E5: main (in /var/www/json/a.out) 
==14573== If you believe this happened as a result of a stack 
==14573== overflow in your program's main thread (unlikely but 
==14573== possible), you can try to increase the size of the 
==14573== main thread stack using the --main-stacksize= flag. 
==14573== The main thread stack size used in this run was 8388608. 
JSON string: {"coooooool": { "name" : "coooooooooool","name" : 1"}"}n==14573== 
==14573== HEAP SUMMARY: 
==14573==  in use at exit: 0 bytes in 0 blocks 
==14573== total heap usage: 17 allocs, 17 frees, 1,511 bytes allocated 
==14573== 
==14573== All heap blocks were freed -- no leaks are possible 
==14573== 
==14573== For counts of detected and suppressed errors, rerun with: -v 
==14573== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) 
Segmentation fault (core dumped) 
+1

なぜ閉じ括弧の前に引用符があるのですか? –

+0

'json_object * jobj'にはどこのメモリが割り当てられていますか? json libはそれを行うのか、それともあなたの責任ですか?あなたがいるように見えますが、前にライブラリを使用していないので、ダブルチェックしてください。 'アドレス0xfffffff5はスタックされていないか、mallocされているか(最近)free'd'ですか? –

答えて

0

のようにそれをコンパイル:あなたのJSON文字列のエラーを持っています。

{"coooooool": { "name" : "coooooooooool","name" : 1"}"} 

2つのキーが同じ名前を持ち、文字列の最後の二つの二重引用符文字は場違い完全にある:
あなたのJSON文字列は、(引用符をエスケープせずに)次のとおりです。
この文字列は有効なjsonではないため、json_tokener_parseはNULLを返します。
あなたは文字列を解析するために失敗をキャッチするためにエラーチェックを実行する必要があり、すなわち、このようなチェックを追加:あなたのコードで

if(jobj == NULL) { 
    // recover from the error or quit the program 
} 

を、json_object_object_foreachは、セグメンテーションフォールトを引き起こし、NULLポインタを受け取ります。

+0

ええ。 segfaultは無効なjsonのためです。コードはjson_parse()で値を出力できません。私はjson_type_intを意味します。私のコード – sandesh

+0

をチェックしてください。これは、コードがルートオブジェクトに含まれるすべてのキーでループするため、「coooooool」は1つだけです。これはintではなくjsonオブジェクトです。 –

+0

ありがとうございました – sandesh

1

あなたのjsonは無効です。適切にフォーマットされたJSON文字列を試してみて、それが動作します:

#include <stdio.h> 
#include <json/json.h> 

void json_parse(json_object * jobj); 

int main(){ 

    char * string2 = "{" 
      "\"coooooool\": { " 
      "\"name\" : \"coooooooooool\"," 
      "\"name\" : 1" 
      "\"}" 
      "\"}"; 
    char * string = "{\"name\" : \"joys of programming\"}"; 
    printf ("JSON string: %sn", string); 
    // json_object * jobj = malloc(sizeof(json_object)); 
    json_object * jobj = json_tokener_parse(string); 
    json_parse(jobj); 


    return 0; 
} 

void json_parse(json_object * jobj) { 
    enum json_type type; 
    json_object_object_foreach(jobj, key, val) { 
     type = json_object_get_type(val); 
     switch (type) 
     { 
      case json_type_int: printf("type: json_type_int, "); 
       printf("value: %dn", json_object_get_int(val)); 
       break; 
     } 
    } 
} 

あなたは、あなたがそれをする方法を確認するためにlint your jsonことができます。

出力

./test1 
JSON string: {"name" : "joys of programming"} 

私はあなたの問題は単純です。この

gcc -g -v -Wall -std=gnu99 -static -L/path/to/json-c-0.9/lib main.c -o test1 -ljson

+0

その無効なJSONはsegfaultを引き起こすはずです... –

+0

ええ。 segfaultは無効なjsonのためです。コードはjson_parse()で値を出力できません。私はjson_type_intを意味します。私のコードをチェックしてください。 – sandesh

関連する問題