【问题标题】:error in getting avro string获取 avro 字符串时出错
【发布时间】:2017-08-01 13:12:42
【问题描述】:

我正在尝试使用 avro-c 做一个简单的字符串 setter getter 程序。

我的代码是:

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。我做错了什么?

【问题讨论】:

  • 您的编译器打印了哪些警告?你试图让他们沉默是什么?
  • 删除所有警告 working.size 应该是 size_t 类型。我认为 int 可以转换为 size_t。
  • intsize_t 的大小可能不同。 size_t 的存在可能是有原因的。 ;) 而且您的编译器并没有因为name 的错误类型而大喊大叫?除了 AndreKampling 的答案中显示的其他缺陷之外,这些缺陷并不容易解决。如果您的编译器提供了提示,请听!

标签: c serialization avro


【解决方案1】:

必须是下面这个,注意&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 指针指向常量字符,并且您的 sizesize_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());
}

【讨论】:

  • 它因分段错误而退出。使用 gdb 名称调试有一些垃圾值 (gdb) p name $2 = 0x100000000 "\317",
  • 嗨@sanyamjain,如果这个或任何答案解决了您的问题,请点击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多