protoc-c:带有可选字符串的嵌套结构抛出段错误
protoc-c: Nested structure with optional string throws seg fault
正在为我的 C 语言代码尝试 Google 协议缓冲区。
messagefile.proto
===================
mesage othermessage
{
optional string otherstring = 1;
}
message onemessage
{
optional string messagestring = 1;
optional int32 aninteger = 2;
optional othermessage otr_message= 3;
}
============================================= =
--> protoc-c messagefile.proto --c_out=./
这导致了两个文件
--> messagefile.pb-c.c 和 messagefile.pb-c.h
现在我的代码文件将尝试使用
simpleexample.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "messagefile.pb-c.h"
#include <stdbool.h>
int main(int argc, const char * argv[])
{
onemessage msg = ONE__MESSAGE__INIT; //from generated .h code file
void *buf;
unsigned int len;
char *ptr;
//integer initialization
msg.has_aninteger = true;
msg.aninteger = 1;
//accessing the string in onemessage
msg.messagestring = malloc(sizeof("a simple string"));
strncpy(msg.messagestring,"a simple string",strlen("a simple string"));
//trying to initialize the string in the nested structure othermessage
msg.otr_message = malloc(sizeof(othermessage));
msg.otr_message->otherstring = malloc(sizeof("a not so simple string"));
strncpy(msg.otr_message->otherstring,"a not so simple string",strlen("a not so simple string"));
//lets find the length of the packed structure
len = one_message__get_packed_size(&msg); //from generated .h code
//lets arrange for as much size as len
buf = malloc(len);
//lets get the serialized structure in buf
one_message__pack_to_buffer(&msg,buf); //from generated code
//write it to a stream, for now the screen
fwrite(buf,len,1,stdout);
//free buffer
free(buf);
return 0;
}
我编译为 gcc -o testout messagefile.pb-c.c simpleexample.c -lprotobuf-c
我面临的问题是在尝试初始化嵌套的 othermessage 变量然后调用 get_packed_size 它抛出分段错误时。
我尝试了各种组合,我可以说,每当在嵌套 class 中包含字符串时,我都面临使用 google 协议访问那些字符串的问题。
我错过了什么吗?有什么问题吗
谁能帮忙。
注意:可能存在一些一般语法错误,请忽略它们。
谢谢。
note:There might be a few general syntax errors please ignore them.
呃...它们有点难以忽略,因为您的代码无法编译:-)
无论如何,除了语法错误之外,您还需要对您的代码进行几处更正。为了使用字段 otr_message
,仅 malloc()
是不够的。您还需要对其进行初始化,以便消息中的 headers 获得正确的值。这是用 init()
完成的,像这样:
//trying to initialize the string in the nested structure othermessage
msg.otr_message = malloc(sizeof(othermessage));
othermessage__init(msg.otr_message);
然后你使用错误的函数对你自己的数组进行打包。如 here 所述,您需要使用 pack()
而不是 pack_to_buffer()
,如下所示:
//lets get the serialized structure in buf
onemessage__pack(&msg,buf); //from generated code
最后,您的 strncpy()
调用有误。使用 strlen()
计算的长度不包括您确实需要的空终止符。所以你需要取 strlen()+1
或使用 sizeof()
,像这样:
strncpy(msg.messagestring,"a simple string",sizeof("a simple string"));
进行这些更改后,该示例对我有效:
$ ./testout
a simple string
a not so simple string
正在为我的 C 语言代码尝试 Google 协议缓冲区。
messagefile.proto
===================
mesage othermessage
{
optional string otherstring = 1;
}
message onemessage
{
optional string messagestring = 1;
optional int32 aninteger = 2;
optional othermessage otr_message= 3;
}
============================================= =
--> protoc-c messagefile.proto --c_out=./ 这导致了两个文件
--> messagefile.pb-c.c 和 messagefile.pb-c.h
现在我的代码文件将尝试使用 simpleexample.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "messagefile.pb-c.h"
#include <stdbool.h>
int main(int argc, const char * argv[])
{
onemessage msg = ONE__MESSAGE__INIT; //from generated .h code file
void *buf;
unsigned int len;
char *ptr;
//integer initialization
msg.has_aninteger = true;
msg.aninteger = 1;
//accessing the string in onemessage
msg.messagestring = malloc(sizeof("a simple string"));
strncpy(msg.messagestring,"a simple string",strlen("a simple string"));
//trying to initialize the string in the nested structure othermessage
msg.otr_message = malloc(sizeof(othermessage));
msg.otr_message->otherstring = malloc(sizeof("a not so simple string"));
strncpy(msg.otr_message->otherstring,"a not so simple string",strlen("a not so simple string"));
//lets find the length of the packed structure
len = one_message__get_packed_size(&msg); //from generated .h code
//lets arrange for as much size as len
buf = malloc(len);
//lets get the serialized structure in buf
one_message__pack_to_buffer(&msg,buf); //from generated code
//write it to a stream, for now the screen
fwrite(buf,len,1,stdout);
//free buffer
free(buf);
return 0;
}
我编译为 gcc -o testout messagefile.pb-c.c simpleexample.c -lprotobuf-c
我面临的问题是在尝试初始化嵌套的 othermessage 变量然后调用 get_packed_size 它抛出分段错误时。
我尝试了各种组合,我可以说,每当在嵌套 class 中包含字符串时,我都面临使用 google 协议访问那些字符串的问题。 我错过了什么吗?有什么问题吗
谁能帮忙。
注意:可能存在一些一般语法错误,请忽略它们。
谢谢。
note:There might be a few general syntax errors please ignore them.
呃...它们有点难以忽略,因为您的代码无法编译:-)
无论如何,除了语法错误之外,您还需要对您的代码进行几处更正。为了使用字段 otr_message
,仅 malloc()
是不够的。您还需要对其进行初始化,以便消息中的 headers 获得正确的值。这是用 init()
完成的,像这样:
//trying to initialize the string in the nested structure othermessage
msg.otr_message = malloc(sizeof(othermessage));
othermessage__init(msg.otr_message);
然后你使用错误的函数对你自己的数组进行打包。如 here 所述,您需要使用 pack()
而不是 pack_to_buffer()
,如下所示:
//lets get the serialized structure in buf
onemessage__pack(&msg,buf); //from generated code
最后,您的 strncpy()
调用有误。使用 strlen()
计算的长度不包括您确实需要的空终止符。所以你需要取 strlen()+1
或使用 sizeof()
,像这样:
strncpy(msg.messagestring,"a simple string",sizeof("a simple string"));
进行这些更改后,该示例对我有效:
$ ./testout
a simple string
a not so simple string