#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, для этой цели служит объявление массива без указания размера вообще.
Комментариев нет:
Отправить комментарий