Jump to content

Гибкий член массива

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] широко доступны.

  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. ^ «Структурные декларации» . Майкрософт . Проверено 25 апреля 2020 г.
  7. ^ Например, «Массивы (C++)» . Майкрософт . Проверено 25 апреля 2020 г. Массив нулевого размера допустим только в том случае, если массив является последним полем в структуре или объединении и когда включены расширения Microsoft (/Ze).
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: ca82fd481d8b6b13c33cc5cc8119909b__1704114600
URL1:https://arc.ask3.ru/arc/aa/ca/9b/ca82fd481d8b6b13c33cc5cc8119909b.html
Заголовок, (Title) документа по адресу, URL1:
Flexible array member - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)