Несколько дней назад, один мой знакомый озадачил конструкцией такого вида:
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);
и дальше работать как надо.