我正在通过TCP向客户端应用程序发送一个污垢。 Dir节点是一个如下所示的结构:
struct node {
char *name;
int count_subnodes;
struct node **subnodes;
};
序列化:
void serialize(void *buffer, struct node *n, int *c){
int i;
if(!n)
return;
memcpy(buffer+(*c), n, sizeof(*n));
*c+=sizeof(n);
for(i = 0; i < n->count_subnodes; i++){
serialize(buffer, n->subnode[i], c);
}
}
我做错了什么?当我为子节点递归调用serialize时,会出现段错误。另外,我是否需要任何类型的划界标记,以便我可以在客户端重建树?
编辑:c是保持缓冲区中当前位置的计数。
编辑2:错字。它的大小是(* n)而不是c。遗憾
答案 0 :(得分:1)
你怎么知道你的缓冲区足够大?
sizeof(n)
将给出指针的大小,而不是结构;使用sizeof(*n)
检查n->subnode[i]
不是NULL
答案 1 :(得分:-1)
您正在复制struct n,并为其提供size c
,即int*
。我认为你的问题在于这一行:
memcpy(buffer+(*c), n, sizeof(c));
另外,你真的不想序列化结构本身。如果你这样做,那么当你真的想要发送这个名字时,你就会发送一个指向这个名字的指针。
我认为您需要序列化name
以及子节点计数。也许是这样的:
int name_length = strlen(n->name + 1); /* +1 for null terminator. */
memcpy(buffer+(*c), n->name, name_length);
*c += name_length;
memcpy(buffer+(*c), &n->count_subnodes, sizeof(n->count_subnodes));
*c += sizeof(n->count_subnodes);
请记住,在为不同系统序列化二进制数据时,可能会遇到endianness个问题。
确保您将buffer
分配得足够大。超越buffer
肯定会出现段错误。它也可能与您最初调用serialize
的方式有关。您还需要确保您的node
树有效且没有悬空指针。您必须为int*
传递有效的c
。
您可能希望发布调用代码的最小示例。