Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Для чего нужны массивы нулевого размера?

#cpp #c #массивы


Подскажите, для чего они нужны?

И является ли следующий пример валидным и законным? :

int arr_1[0], 
    arr_2[0];

memset(arr_1, 0, sizeof(int) * 0);

memcpy(arr_1, arr_2, sizeof(int) * 0);


PS. Приведу более конкретный пример, где бы я хотел использовать массивы переменной
длины с возможностью задания нулевого размера:

void thread_func(void *_param)
{
    const size_t di_count = ((t_param*)_param)->di_count;
    const size_t ai_count = ((t_param*)_param)->ai_count;

    uint8_t di[di_count];
    uint16_t ai[ai_count];

    while (1)
    {
        // Поддержание соединения.
        // ...

        // Известно, что (di_count || ai_count) != 0

        // Опрашиваем дискретные сигналы, если они есть.
        int d = 0;
        if (di_count > 0)
        {
            d = get_di(..., ..., di, di_count);
        }

        // Опрашиваем аналоговые сигналы, если они есть.
        int a = 0;
        if (ai_count > 0)
        {
            a = get_ai(..., ..., ai, ai_count);
        }

        // Формируем пакет с результатами опроса и добавляем его в очередь.
        pack *new_pack = create_pack(...,
                                     a || d,// Доступность объекта.
                                     di_count,
                                     di_count ? di : NULL,
                                     ai_count,
                                     ai_count ? ai : NULL);

        if (new_pack != NULL)
        {
            push_pack(..., new_pack);
        }
    }
}


Код сильно-пресильно упрощенный, но, надеюсь, моя идея ясна.

Так вообще делают? Я довольно часто встречаюсь с ситуациями, когда мне необходим
массив переменного размера с возможным размером 0. Ясное дело, что в описанном случае
обратиться к элементам массива нулевого размера нельзя, но я и не собираюсь, просто
это значительно упрощает код.

В общем, корректно ли делать так, как я делаю?
    


Ответы

Ответ 1



И в С, и в С++ запрещено объявление массивов константного нулевого размера. Такие объявления являются ошибочными с точки зрения этих языков. Дополнительно, в С, если в точке объявления variable length array значение размера не является положительным, то поведение не определено. Массив нулевого размера можно разве что выделить через new[] в С++. Объявления массивов явного нулевого размера поддерживаются некоторыми компиляторами в качестве нестандартного расширения языка для облегчения реализации "struct hack", хотя на самом деле можно прекрасно обойтись и без этого. В языке С, начиная с С99, для этой цели служит объявление массива без указания размера вообще.

Комментариев нет:

Отправить комментарий