char data[0] — wtf?

Несколько дней назад, один мой знакомый озадачил конструкцией такого вида:

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);

и дальше работать как надо.

Добавить комментарий

Ваш адрес email не будет опубликован.