2017-01-04 9 views
0

私はCのプログラマーではないが、最近興味を持っている。私はC libyamlライブラリを使ってYAMLファイルのノードを修正しようとしています。イベントのスカラーデータからノードを変更しようとすると、コンパイラーは文句を言わないが、セグメント化エラーが発生する。そのループの中で、私は次の値Cで既存のYAMLノードを変更するには?

event.data.scalar.value 

を変更しようとするとしながら、

while (!done) 
{ 
    /* Get the next token. */ 

    if (!yaml_parser_parse(&parser, &event)) 
     goto parser_error; 

    //yaml_parser_scan(&parser, &token); 

    /* Check if this is the stream end. */ 

    if(beginServerNodes && event.type == 8) { 
     beginServerNodes = 0; 
    } 

    if (event.type == YAML_SCALAR_EVENT) { 
     if(beginServerNodes == 1) { 
     //I WANT TO MODIFY THIS VALUE 
     printf("%s\n", event.data.scalar.value); 
     } 
     if(strcmp("servers",event.data.scalar.value) == 0) { 
     beginServerNodes = 1; 
     } 
    } 

    if (event.type == YAML_STREAM_END_EVENT) { 
     done = 1; 
    } 
    /* Emit the token. */ 

    if (!yaml_emitter_emit(&emitter, &event)) 
     goto emitter_error; 
} 

だから、それはコンパイラが文句を言うと、コードは実行されませんタイプyaml_char_t

yaml_char_t *newHost = "10.132.16.48:6379:1 redis-001"; 
    event.data.scalar.value = newHost; 
    event.data.scalar.length = sizeof(newHost); 

でなければなりません。セグメンテーションエラーのあるダイスによってlibyamlテストディレクトリの例を見ても、単にノードを編集している限り直感的なことは何もありません。少なくとも自分自身のようなC newbではありません。

+0

OK、私は実際の問題に見もせずに作ることができる1つの発言:あなたがあるべきものをほとんどのプログラマによって眉をひそめているgoto' '使用して、確かではありませんCから始めるときに使用します。いくつかの[合法的な使用例](http://stackoverflow.com/questions/245742/examples-of-good-gotos-in-c-or-c)がありますが、C通常の日常的なデザインワークフローの一部にするのではなく、それを避けることが最善です。 –

+0

'goto'は使い方が難しいわけではありませんが、他のフロー制御ステートメントと同じように**使用すると**ほとんどの時間とほとんどの学習の楽しさを取り除くバグを見つけにくくなりますC. E.Dijkstraによる[この古典的な](http://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf)を読んでください。 –

+0

@RodyOldenhuis私はあなたには、gotoコンストラクトの使用がライブラリ自体の例から直接取られたことに同意します。 –

答えて

1

Libyamlは、各スカラーの値がfree()によって削除されると予想しています。だから、malloc() EDメモリと、この値を初期化する必要があります。

const char* newHost = "10.132.16.48:6379:1 redis-001"; 
event.data.scalar.value = (yaml_char_t*)strdup(newHost); 
event.data.scalar.length = strlen(newHost); 
関連する問題