2017-08-01 7 views
0

avro-cを使用して簡単な文字列セッターゲッタープログラムを実行しようとしています。avro文字列を取得する際にエラーが発生しました

avro_value_t frame_value; 
avro_schema_t frame_schema = avro_schema_string(); 
avro_value_iface_t *frame_iface = avro_generic_class_from_schema(frame_schema); 
avro_generic_value_new(frame_iface, &frame_value); 

char *name; 
int size; 

avro_value_set_string(&frame_value,"hello"); 
avro_value_get_string(&frame_value,name,&size); 
printf("\nname is %s",name); 
printf("\nsize is %d",size); 

が、サイズがヌル文字を含む6である正しいですが、それはnull文字列を出力します

私のコードです。私は間違って何をしていますか?

+1

どの警告がコンパイラの印刷をしましたか?そして、あなたはそれらを沈黙させるために何をしたのですか? – Gerhardh

+0

すべての警告の削除worked.sizeは、size_t型である必要があります。 intはsize_tにキャストできると思った。 –

+0

'int'と' size_t'は異なるサイズを持つかもしれません。 'size_t'が存在する理由があるかもしれません。 ;)そして、あなたのコンパイラは、 'name'の間違った型についてひどく悲鳴を上げませんでしたか? AndreKamplingの答えに示されている他の欠陥の他に、それはうまくいかないものです。あなたのコンパイラがヒントを提供するならば、聞いてください! – Gerhardh

答えて

0

それは代わりにnameの以下、ノート&nameでなければなりません:関数は文字定数へのダブルポインタを期待するよう

avro_value_get_string(&frame_value, &name, &size); 

。フードの下のポインタは、セッターによって設定された内部文字配列に設定する必要があります。

here in the API documentationを参照してください:

int avro_value_get_string(const avro_value_t *value, 
          const char **dest, size_t *size); 

また、あなたのnameポインタが一定の文字を指し、あなたsizesize_tタイプではないintさせる:

const char *name; 
size_t size; 

さらにavro_generic_value_newを使用した後、あなたがで、使用後にスペースの割り当てを解除する必要があります。また、あなたが使用する必要があり

avro_generic_value_free(&frame_value); 

:APIは、参照カウントを行うよう

avro_value_iface_decref(frame_iface); 
avro_schema_decref(frame_schema); 

、それは、使用後にスペースを解放する必要があります。アブロCライブラリリターンで

ほとんどの機能:


また私は、彼らがintあるか、ポインタと意味がAPI documentationによって説明され、常に関数の戻り値をチェックすることをお勧めします単一のintステータスコード。 POSIX errno.hの規則に従い、0のステータスコードは成功を示します。ゼロでないコードは、エラー状態を示す。一部の関数は、intステータスコードの代わりにポインタ値を返します。これらの関数の場合、NULLポインタはエラーを示します。

あなたはavro_strerror機能を使用して最新のエラーの内容を文字列で取得することができます。

avro_schema_t schema = avro_schema_string(); 
if (schema == NULL) { 
    fprintf(stderr, "Error was %s\n", avro_strerror()); 
} 
+0

セグメンテーションフォルトで終了します。gdbの名前にいくつかの迷惑メールの値があります (gdb)pの名前 $ 2 = 0x100000000 "\ 317"、<不完全なシーケンス\ 372 \ 355 \ 376 \ 007> –

+0

こんにちは@anyanyjain [それを受け入れる](https://meta.stackexchange.com/q/5234/179419)をクリックしてください。これは、あなたが解決策を見つけ出し、回答者とあなた自身の両方に評判を与えていることを広範なコミュニティに示します。これを行う義務はありません。 –

関連する問題