2017-08-01 51 views
0

我正在嘗試使用av​​ro-c做一個簡單的字符串setter getter程序。錯誤獲取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包括空字符它輸出一個空字符串。我究竟做錯了什麼?

+1

哪個警告做你的編譯器打印?你試圖讓他們沉默的是什麼? – Gerhardh

+0

刪除所有working.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); 

的函數需要一個雙指針不斷的性格。有必要將指針下的指針設置爲由setter設置的內部字符數組。

here in the API documentation

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

也會使你的name指針指向不變的性格和你的size是一個size_t類型不int

const char *name; 
size_t size; 

進一步使用avro_generic_value_new後,你必須在使用後回收空間:

avro_generic_value_free(&frame_value); 

你也需要使用:

avro_value_iface_decref(frame_iface); 
avro_schema_decref(frame_schema); 

的API做引用計數,有必要免費使用後的空間。


而且我建議經常檢查的函數的返回值,它們是int或指針和含義由API documentation解釋:在Avro的C庫回報

大部分功能一個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」,

+0

嗨@sanyamjain如果這個或任何答案已經解決了你的問題,請考慮點擊該複選標記(https://meta.stackexchange.com/q/5234/179419)[接受它]。這向更廣泛的社區表明,您已經找到了解決方案,併爲答覆者和您自己提供了一些聲譽。沒有義務這樣做。 –