Это так же, как выражено.
uint8_t transformed[0]
для практических целей является «указателем» на массив с нулевыми элементами и ведет себя как любой другой результат a[n]
, включая то, что вы не можете получить доступ к более чем [n]
элементов массива.
Хорошо, что это дает вам, а не просто указатель на динамически изменяемый массив?Массивы нулевой длины полезны только тогда, когда у вас есть большая структура, для которой требуется поле динамической длины, и вам необходимо разделить структуру между программами, системами, программами и т. Д. В этих случаях вы не можете выделить указатель внутри структуры, так как онине будет указывать на память в системе приемника.Фактически структура имеет переменный размер.
Обратите внимание на поле с именем length
чуть ниже transformed
;Скорее всего, это длина массива transformed
.Чтобы получатель вычислял размер структуры, он считывал бы длину и вычислял размер преобразованного, чтобы определить размер структуры.(length*sizeof(uint8_t)
)
Вы можете думать о массивах нулевой длины как о указателе, содержимое которого встроено само по себе и очень похоже на гибкий элемент массива, однако ему не хватает безопасности (если вы могли бы назвать его безопасным)гибких членов массива.
Вы не предоставили достаточно кода, чтобы вникнуть в то, что может делать uint8_t padding[0]
, но это в сочетании с __attribute__((packed))
заставило бы меня поверить в то, что они сочли необходимым вручную управлять структурой памяти структуры, но опять же,соответствующий код отсутствует, чтобы вывести это.