我有以下类型的代码:
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
成员的信息?
我可以用我的编译器测试它,但是在这种情况下每个编译器的工作方式都相似吗?
标准的内容如下:
作为一种特殊情况,具有多个的结构的最后一个元素 命名成员可能具有不完整的数组类型;这称为 灵活的数组成员。在大多数情况下,灵活的阵列成员 被忽略。特别是,结构的大小就好像 灵活数组成员被省略,除了它可能有更多 尾随填充比省略所暗示的要多。
您的示例确实有效,因为 C 没有在添加元素时动态变大的数组。因此 *msg 的大小是 sizeof u32 + paddings(如果有),但它不会计入列表成员,当您“分配”缓冲区以及当您想知道该“的实际大小”时,您必须自己考虑这一点对象”,就像你所做的那样。