Intereting Posts
Преобразование с шестнадцатиричным преобразованием в десятичное число Является ли ++ таким же, как + = 1 для указателей? Преобразование значений inout в UnsafeMutablePointer <Неуправляемый ?> Как установить STM32 для генерации стандартного CRC32 Скомпилировать и запустить программу без main () в C какова цель помещения пространства в scanf, такого как scanf («% c», & ch) вместо scanf («% c», & ch)? GDB Не удается вставить точку останова, Не удается получить доступ к памяти по адресу XXX? В C есть «i + = 1;» атомный? Как наносить различные типы структур из стека освобождение строки, выделенной в strdup () из flex / bison Вы предпочитаете «if (var)» или «if (var! = 0)»? Может ли выражение быть слишком длинным в программе ac для gcc для компиляции? Вопрос об общей библиотеке и данных, относящихся к streamу Несколько кадров потеряно, если я использую av_read_frame в FFmpeg Не удалось выйти из дочернего процесса, используя fork

Массив переменной длины с длиной 0?

В C массиву обычно не разрешается иметь размер 0 (если я не использую одно или другое расширение на стороне компилятора).

OTOH, существуют VLA, длина которых может оказаться равной 0.

Разрешены ли они?

Я говорю о следующем коде:

void send_stuff() { char data[4 * !!flag1 + 2 * !!flag2]; uint8_t cursor = 0; if (flag1) { // fill 4 bytes of data into &data[cursor] cursor += 4; } if (flag2) { // fill 2 bytes of data into &data[cursor] cursor += 2; } } 

Результатом является массив data с длиной 0, 2, 4 или 6, в зависимости от комбинации флагов.

Вопрос в том, является ли этот допустимый код для случая, когда массив имеет длину 0?

Это недействительно, если мы перейдем к разделу стандарта C99 проекта 6.7.5.2 заявлении, 6.7.5.2 параграфе 5, говорится ( основное внимание ):

если размер является выражением, которое не является целочисленным постоянным выражением: если оно встречается в объявлении в области прототипа функции, оно рассматривается как если бы оно было заменено на *; в противном случае каждый раз, когда он оценивается, он должен иметь значение больше нуля . […]

Фактически с clang позволяющим дезинфицирующее средство для неопределенного поведения с использованием -fsanitize=undefined может генерировать предупреждение во время выполнения для этого случая, см. Его в прямом эфире :

Ошибка выполнения: переменная длина массива связана с неположительным значением 0