> ---------- > | flags | > |--------| > | length | > |--------| > | data | > | .... | > ---------- > > struct pkt > { > uint32_t flags; > uint32_t length; > char data[0]; // data[1] для старых компиляторов > }; > > > struct pkt* create_pkt( size_t data_length ) > { > struct pkt* pkt = > (struct pkt*) malloc( sizeof(struct pkt) + data_length ); > > if (pkt != NULL) > { > pkt->flags = PKT_NODELAY; > pkt->length = data_length; > memset( pkt->data, 0, data_length ); > pkt->data[4] = 'r'; > pkt->data[5] = 't'; > pkt->data[6] = 'f'; > pkt->data[7] = 'm'; > } > > returm pkt; > } > > > Код непереносим, поскольку sizeof(struct pkt) будет давать разные > значения даже для разных версий gcc, но здесь мы не об этом. > > Разумеется, это можно сделать и другими способами, но эстетическое > чувство программистов вынуждает их желать работать с данными пакета > обращаясь к члену структуры (так код лучше выглядит), а не извращаясь с > указателями и кастами struct в char. > > До "изобретения" массивов с нулевой длиной приходилось пользоваться > массивами с единичной длиной.
это ужасно! я начинаю понимать отчего так много глючных программ на свете :-\