我的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"
。
当我这样做时,我会遇到分段错误。
知道为什么吗?
答案 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
至少有一个元素。新初始化的foo
将n_destination_hops = 0;
和destination_hops = NULL;
,在这种情况下,尝试访问destination_hops[0]
会尝试取消引用NULL
,这是一个段错误。 (或者UB,如果你愿意的话.9