Гибкий член массива - 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] существовать.

Рекомендации

  1. ^ "Менее известные особенности C". Получено 30 декабря, 2014.
  2. ^ "гибкий элемент массива". Блог Йенса Густедта. 14 марта 2011 г.. Получено 9 октября, 2018.
  3. ^ «P99: гибкие элементы массива». p99.gforge.inria.fr. Получено 9 октября, 2018.
  4. ^ C99 раздел §6.7.2.1, пункт 16, стр. 103, http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
  5. ^ «Нулевая длина - Использование коллекции компиляторов GNU (GCC)». Получено 30 декабря, 2014.
  6. ^ "Объявления структуры". Microsoft. Получено 25 апреля, 2020.
  7. ^ Например., «Массивы (C ++)». Microsoft. Получено 25 апреля, 2020. Массив нулевого размера допустим только в том случае, если массив является последним полем в структуре или объединении и когда включены расширения Microsoft (/ Ze).