Несколько дней назад, один мой знакомый озадачил конструкцией такого вида:
struct pkt { uint32_t flags; uint32_t length; char data[0]; };
Минут 30 мы поломали голову над тем, что это может значить, но вскоре забили. А буквально с час назад он мне дал ссылку, по которой объясняется, что же это такое.
Это поле даёт возможность выделить память под структуру такой конструкцией:
struct pkt* pkt = (struct pkt*) malloc( sizeof(struct pkt) + data_length )
и потом, сделав memset(&pkt->data,0,data_length), мы сможем обращаться к pkt->data[0..data_length-1] и использовать это поле под свои нужды. IMHO, такое лучше делать следующим образом:
struct pkt { uint32_t flags; uint32_t length; char* data; }; struct pkt* pkt=malloc(sizeof(struct pkt)); pkt->data=malloc(data_length);
и дальше работать как надо.