灵活的数组成员是否会增加结构的大小?

时间:2011-07-18 11:28:05

标签: c struct sizeof

我有以下类型的代码:

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成员的内容?

我可以用我的编译器测试它,但在这种情况下每个编译器的工作方式是否相似?

2 个答案:

答案 0 :(得分:11)

以下是标准所说的内容:

  

作为一种特殊情况,结构的最后一个元素有多个   命名成员可能具有不完整的数组类型;这叫做a   灵活的阵列成员。在大多数情况下,灵活的阵列成员   被忽略了。特别是,结构的大小就像是   灵活的阵列成员被省略,但它可能有更多   尾随填充比遗漏意味着暗示。

答案 1 :(得分:1)

您的示例可以正常工作,因为在添加元素时,C没有动态变大的数组。因此* msg的大小是u32 + paddings的大小(如果有的话),但它不会计入列表成员,当你“分配”缓冲区时你需要自己考虑,当你想知道它的实际大小时对象“,就像你做的那样。