我有以下类型的代码:
typedef struct
{
u32 count;
u16 list[];
} message_t;
...
message_t* msg = (message_t*)buffer;
msg->count = 2;
msg->list[0] = 123;
msg->list[1] = 456;
size_t total_size = sizeof(*msg) + sizeof(msg->list[0]) * msg->count;
send_msg( msg, total_size );
有问题的行是sizeofs的行。我不确定这是计算所需空间的正确方法。
sizeof(*msg)
是否包含有关list
成员的内容?
我可以用我的编译器测试它,但在这种情况下每个编译器的工作方式是否相似?
答案 0 :(得分:11)
以下是标准所说的内容:
作为一种特殊情况,结构的最后一个元素有多个 命名成员可能具有不完整的数组类型;这叫做a 灵活的阵列成员。在大多数情况下,灵活的阵列成员 被忽略了。特别是,结构的大小就像是 灵活的阵列成员被省略,但它可能有更多 尾随填充比遗漏意味着暗示。
答案 1 :(得分:1)
您的示例可以正常工作,因为在添加元素时,C没有动态变大的数组。因此* msg的大小是u32 + paddings的大小(如果有的话),但它不会计入列表成员,当你“分配”缓冲区时你需要自己考虑,当你想知道它的实际大小时对象“,就像你做的那样。