Гибкий член массива - Flexible array member
C структура типы данных могут заканчиваться гибкий множество член[1] без указанного размера:
структура вектор { короткая len; // должен быть хотя бы один другой член данных двойной обр[]; // гибкий элемент массива должен быть последним // Компилятор может зарезервировать здесь дополнительное пространство для заполнения, как это может быть между членами структуры};
Обычно такие конструкции служат заголовком в более крупном, распределение переменной памяти:
структура вектор *вектор = маллок(...);вектор->len = ...;за (int я = 0; я < вектор->len; я++) вектор->обр[я] = ...; // прозрачно использует правильный тип (double)
Влияние на размер структуры и отступ
В размер
оператор на таком структура
дает размер структуры, как если бы элемент гибкого массива был пуст. Это может включать в себя набивку, добавленную для размещения гибкого элемента; компилятор также может повторно использовать такое заполнение как часть самого массива.[2]
Обычно выделяют sizeof (структура) + array_len*размер(элемент массива)
байтов.
В этом нет ничего плохого, однако он может выделить на несколько байтов больше, чем необходимо: компилятор может изменить назначение некоторых дополнений, включенных в sizeof (структура)
. Если это вызывает беспокойство, доступны макросы[3] для вычисления минимального размера, гарантируя, что заполнение компилятора не нарушено.
Поскольку массив может начинаться с заполнения до конца структуры, доступ к его содержимому всегда должен осуществляться через индексирование (обр [я]
) или же смещение
, нет размер
.
Доступность
Гибкие элементы массива были официально стандартизированы в C99,[4] однако компиляторы принимали элементы массива нулевого размера с тем же эффектом (например, GCC,[5] Microsoft Visual C[6]).
Члены гибкого массива официально не входят в 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.
- ^ "Объявления структуры". Microsoft. Получено 25 апреля, 2020.
- ^ Например., «Массивы (C ++)». Microsoft. Получено 25 апреля, 2020.
Массив нулевого размера допустим только в том случае, если массив является последним полем в структуре или объединении и когда включены расширения Microsoft (/ Ze).