[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: gcc bug?



> ----------
> | 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.
> 
> До "изобретения" массивов с нулевой длиной приходилось пользоваться
> массивами с единичной длиной.

это ужасно!
я начинаю понимать отчего так много глючных программ на свете :-\



Reply to: