谷歌Protobuf-c重复字符串

时间:2014-08-11 16:30:17

标签: c arrays string pointers protocol-buffers

我的Google protobuf-c proto文件如下所示:

message foo{
  required uint32 addresscount= 1;
  repeated string destination_hops= 2;
}

我想要一个字符串数组,addresscount应该给出数组元素的数量。

生成的protobuf-h文件是

struct  _foo
   {
   ProtobufCMessage base;
   uint32_t addresscount;
   size_t n_destination_hops;
   char **destination_hops;
   };

我假设n_destination_hops是字符串destination_hops在消息中出现的次数。我为此目的保留了地址,我猜这不是必需的。我的问题是:

char **destination_hops是指向char *指针数组的指针。每个索引可以具有不同的长度。当protobuf将其打包到流中时,它将如何知道每个char *指针的大小。 protobuf是否假设所有destination_hops的大小相同且是size_t n_destination_hops给出的?

DOUBT 2:

char ** destination_hops是一个char *指针数组。

这意味着我可以将其视为char *destination_hops[0]char *destination_hops[1]

如果这是正确的,那么我不应该设置char *destination_hops[0] = "abc"

当我这样做时,我会遇到分段错误。

知道为什么吗?

1 个答案:

答案 0 :(得分:0)

  

我认为n_destination_hops是字符destination_hops在消息中出现的次数。

是的。

  

我为此目的保留了addresscount,我猜这不是必需的。

右。

  

char **destination_hops是指向char *指针数组的指针。每个索引可以具有不同的长度。 protobuf如何知道每个char *指针在将其打包成流时的大小。

在字符串的线表示中,它前面是字符串的长度,编码为压缩整数。在内存中,它们只是普通的以零结尾的C字符串,所以:

  • NUL不是字符串

  • 中的有效字符
  • 可以使用strlen

  • 计算长度

Protobuf要求string的值是UTF-8编码字符序列。如果要包含NUL或不属于有效UTF-8序列的字节,请使用bytes代替string。如果这样做,内存数据结构将包含显式长度。

  

我不应该设置char *destination_hops[0] = "abc"

我想你的意思是你应该能够写下来:

destination_hops[0] = "abc";

这是有效的C,但它要求destination_hops至少有一个元素。新初始化的foon_destination_hops = 0;destination_hops = NULL;,在这种情况下,尝试访问destination_hops[0]会尝试取消引用NULL,这是一个段错误。 (或者UB,如果你愿意的话.9