Гибкий член массива
C Типы данных структуры могут заканчиваться гибким массива. элементом [1] без указания размера:
struct vectord {
short len; // there must be at least one other data member
double arr[]; // the flexible array member must be last
// The compiler may reserve extra padding space here, like it can between struct members
};
Обычно такие структуры служат заголовком в более крупном распределении переменной памяти :
struct vectord *vector = malloc(...);
vector->len = ...;
for (int i = 0; i < vector->len; i++)
vector->arr[i] = ...; // transparently uses the right type (double)
Влияние на размер структуры и заполнение
[ редактировать ]The sizeof
оператор на таком struct
дает размер структуры, как если бы элемент гибкого массива был пустым. Это может включать добавление прокладки для размещения гибкого элемента; компилятор также может повторно использовать такое дополнение как часть самого массива. [2]
Обычно выделяют sizeof(struct) + array_len*sizeof(array element)
байты.
В этом нет ничего плохого, но при этом может быть выделено на несколько байт больше, чем необходимо: компилятор может переназначить некоторые дополнения, включенные в sizeof(struct)
. Если это вас беспокоит, доступны макросы. [3] для вычисления минимального размера, гарантируя при этом, что заполнение компилятора не будет нарушено.
Поскольку массив может начинаться с заполнения до конца структуры, доступ к его содержимому всегда следует осуществлять через индексацию ( arr[i]
) или offsetof
, нет sizeof
.
Доступность
[ редактировать ]Члены гибкого массива были официально стандартизированы в C99 . [4] На практике компиляторы (например, GCC , [5] МСВК [6] ) предоставили их задолго до того, как C99 был стандартизирован.
Члены гибкого массива официально не являются частью C++ , а являются расширениями языка. [7] широко доступны.
Ссылки
[ редактировать ]- ^ «Менее известные функции C» . Проверено 30 декабря 2014 г.
- ^ «гибкий член массива» . Блог Йенса Густедта . 14 марта 2011 года . Проверено 9 октября 2018 г.
- ^ «P99: Гибкие элементы массива» . p99.gforge.inria.fr . Проверено 9 октября 2018 г.
- ^ Раздел C99 §6.7.2.1, пункт 16, стр. 103, http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
- ^ «Нулевая длина — использование коллекции компиляторов GNU (GCC)» . Проверено 30 декабря 2014 г.
- ^ «Структурные декларации» . Майкрософт . Проверено 25 апреля 2020 г.
- ^ Например, «Массивы (C++)» . Майкрософт . Проверено 25 апреля 2020 г.
Массив нулевого размера допустим только в том случае, если массив является последним полем в структуре или объединении и когда включены расширения Microsoft (/Ze).