Увеличивает ли член гибкого массива размер структуры? - PullRequest
7 голосов
/ 18 июля 2011

У меня есть следующий вид кода:

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 ]

11 голосов
/ 18 июля 2011

Вот что говорит стандарт:

В особом случае последний элемент структуры с более чем одним именованным элементом может иметь неполный тип массива;это называется членом гибкого массива.В большинстве случаев член гибкого массива игнорируется.В частности, размер структуры такой, как если бы элемент гибкого массива был опущен , за исключением того, что он может иметь больше конечного заполнения, чем это может означать упущение.

1 голос
/ 18 июля 2011

Ваш пример работает, так как C не имеет массивов, которые динамически увеличиваются при добавлении элементов. Таким образом, размер * msg равен размеру отступов u32 +, если таковые имеются, но он не будет учитываться для элемента списка, который вы должны учитывать самостоятельно, когда вы «выделяете» буфер и хотите узнать фактический размер этого » объект ", как вы сделали.

...