灵活数组成员会增加结构体的大小吗?

问题描述 投票:0回答:2

我有以下类型的代码:

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 struct sizeof flexible-array-member
2个回答
17
投票

标准的内容如下:

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.