Что такое гибкий массив? - PullRequest
3 голосов
/ 29 апреля 2010

Что такое Гибкий Массив? Я не могу найти много на этом.

Ответы [ 5 ]

8 голосов
/ 29 апреля 2010

Есть несколько вещей, к которым это может относиться. Единственное место, где я видел, что точная формулировка часто использовалась, это C99.

Член гибкого массива - это официальное имя C99, которое обычно (обычно) называлось "структурным хаком". Основная идея заключается в том, что вы определяете структуру примерно так:

struct x {
    int a; // whatever members you want here.
    size_t size;
    int x[]; // no size, last member only
};

Это используется в основном (или исключительно) с динамическим распределением. Когда вы хотите выделить объект этого типа, вы выделяете достаточно дополнительного пространства для любого необходимого размера массива:

struct x *a = malloc(sizeof(struct x) + 20 * sizeof(int));
a->size = 20;

Элемент size не является строго необходимым, но часто удобен для отслеживания размера, выделенного для элемента. В приведенном выше есть место для 20 int, но суть в том, что у вас может быть несколько вокруг, каждый со своим размером.

3 голосов
/ 29 апреля 2010

Гибкого массива не существует, но есть элемент гибкого массива. Он используется для предоставления доступа к данным переменной длины в качестве члена структуры.

С http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/strct.htm:

Гибкий член массива, который является Функция C99, может быть элементом структура с более чем одним именем член. Член гибкого массива может быть используется для доступа к переменной длины объект. Член гибкого массива должен быть последним элементом такого структура, и она имеет неполный тип.

2 голосов
/ 29 апреля 2010

Гибкий массив - это массив, границы индекса которого определяются во время выполнения и могут изменяться в течение всего времени существования массива.

Массивы Java являются гибкими. Например, в Java вы можете назначить один массив другому:

int[] a1 = {1, 2, 3, 4};
int[] a2 = {1, 2, 3};
a1 = a2;

Сначала a1 имеет диапазон индекса 0–3, а a2 имеет диапазон индекса 0–2.

После присваивания a1 = a2 a1 указывает на массив с диапазоном индекса 0–2, поэтому диапазон индекса a1 изменялся в течение времени жизни a1.

1 голос
/ 29 апреля 2010

Описывает ли это то, о чем вы спрашиваете? Это не уникально для компилятора Sun's C, но это был первый четкий обзор, который я нашел:

Sun Studio 12, обновление 1: руководство пользователя C: члены гибкого массива

0 голосов
/ 10 февраля 2014

Гибкие члены массива являются незаменимыми инструментами в сетевом программировании. В сетевом программировании вы никогда не знаете размер данных заранее.

Например, по некоторым причинам вы пишете код для предоставления полной таблицы ROUTING. Вы никогда не знаете, сколько маршрутов существует заранее, и выделение максимального количества поддерживаемых будет серьезно затруднять ваш код. Самый безопасный вариант - объявить член гибкого массива, подготовить все ваши данные и запустить их один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...