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 индексы и границы массивов не контролируются, оставляя это на
совести программиста.


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

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


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

Ответить