将可变长度结构复制到缓冲区

时间:2016-01-28 04:09:23

标签: c dynamic struct malloc

我想将可变长度的结构复制到缓冲区。我的结构看起来像这样:

typedef struct{
    int flag;
    int size;
    unsigned char name[0];
} sp;

我事先并不知道名字的大小。在我得到size后,我通过以下方式对此结构进行了malloc:

sp *s = malloc(sizeof(sp)+size)

要复制到缓冲区,我这样做:

char *buf = calloc(1000, sizeof(*buf));
memcpy(buf, s, sizeof(sp)); //s is of type sp with all memebers initialized

我的缓冲区仍为空。我做错了什么?

1 个答案:

答案 0 :(得分:3)

我认为你不想将name声明为指针数组,而是将char s数组声明。

typedef struct {
    int flag;
    int size;
    char name[];
} sp;

然后你可以创建这样的实例。

int size = 10;
sp *s = malloc(sizeof(sp)+size);
s->flag = 0;
s->size = size;
strncpy(s->name, "Hello!", size);
s->name[size - 1] = '\0'; // Make sure name is NULL-terminated

您可以按如下方式将结构复制到缓冲区中。

void *buf = calloc(1000, 1);
memcpy(buf, s, sizeof(s)+ s->size);

按如下方式打印出名称以检查其是否有效。

printf("Name is %s.\n", s->name);
printf("The buffer's copy of name is %s.\n", ((sp*)buf)->name);