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

Re: gcc bug?



On Thu, 18 Nov 2004, Dmitry E. Oboukhov wrote:

> в чем смысл масива с нулевой длиной кроме как использование
> идентификатора как указателя?
> можете привести пример?

> C не поддерживает динамическое изменение размеров массива и где можно
> применить массив с нулевой длиной я понять не могу


----------
| 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.

До "изобретения" массивов с нулевой длиной приходилось пользоваться
массивами с единичной длиной.


> struct
> {
>   unsigned char byte[0];
> 
>   int data1;
>   char data2;
>   ...
> } a;
> чтобы обращаться к a.data1 как к a.byte[0], a.byte[1]... ?

Фу!


> и что компилятор ТАКОЕ допускает?!

В языке C индексы и границы массивов не контролируются, оставляя это на
совести программиста.


> > Если виртуальная память закончилась, она ненастоящая.
> наверно китайская подделка?

Виртуальная память - такой вид памяти, чъе происхождение
нисколько не влияет на ее качество.


--
Если уж гайка есть, она должна быть затянута до конца



Reply to: