2017-08-01 50 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)[接受它]。这向更广泛的社区表明,您已经找到了解决方案,并为答复者和您自己提供了一些声誉。没有义务这样做。 –