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: