【问题标题】:Does a flexible array member increase sizeof a struct?灵活的数组成员是否会增加结构的大小?
【发布时间】:2011-07-18 11:28:04
【问题描述】:

我有以下类型的代码:

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

我可以用我的编译器对其进行测试,但在这种情况下,每个编译器的工作方式都相似吗?

【问题讨论】:

  • @Mitch Wheat:是的,你是对的。您的评论是对标题问题的正确答案。为你 +1。

标签: c struct sizeof


【解决方案1】:

标准是这样说的:

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

【讨论】:

  • 但是,帮助我们解释它:这是否意味着 sizeof struct + sizeof list * 元素数将给出“对象”的正确大小,OP 计算它的方式,或者这种方式可以错过“奇怪”的填充?
  • 谢谢。对我的问题的标准答案的引用。我会接受这个答案。关于填充:原因“除了它可能具有比省略所暗示的更多的尾随填充”可能意味着如果没有灵活的数组成员,sizeof(struct) 可能会有所不同。但就我而言,这不是问题。
  • @User1:假设在int 需要四字节对齐的平台上,有一个包含五个char 字段和一个int[] 的结构。如果没有灵活的成员,结构的大小将是五个字节,不需要对齐;有了它,结构将是 8 个字节,必须在 4 个字节的边界上对齐。
【解决方案2】:

您的示例确实有效,因为 C 没有在您添加元素时动态变大的数组。所以 *msg 的大小是 sizeof u32 + paddings,如果有的话,但它不计入列表成员,当你“分配”缓冲区以及当你想知道“的实际大小时,你必须自己考虑”对象”,就像你做的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2011-03-04
    • 2020-02-10
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多