3

我做了一些研究,但找不到明确的赞成或反对意见。

我想要的是一个固定大小的结构+可变长度的部分,这样序列化就可以用简单且不易出错的方式来表达。

struct serialized_data
{
    int len;
    int type;
    char variable_length_text[0];
};

进而:

serialize_data buff = (serialize_data*)malloc(sizeof(serialize_data)+5);
buff->len=5;
buff->type=1;
memcpy(buff->variable_length_text, "abcd", 5);

不幸的是,我找不到 MSVC、GCC、CLang 等是否可以接受。

也许有更好的方法来实现同样的目标?

我真的不想要那些丑陋的演员:

memcpy((char*)(((char*)buffer)+sizeof(serialize_data)), "abcd", 5);
4

1 回答 1

2

该程序使用零长度数组。这不是 C,而是 GNU 扩展。

http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

C89 中的一个常见习语,称为struct hack,是使用:

struct serialized_data
{
    int len;
    int type;
    char variable_length_text[1];
}; 

不幸的是,它作为灵活数组的常见用途并不严格符合。

C99 带有类似的东西来执行相同的任务:一个称为灵活数组成员的功能。这是标准中的一个示例(C99,6.7.2.1p17)

struct s { int n; double d[]; };
int m = 12;  // some value
struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));
于 2012-04-04T21:50:29.423 回答