Массивы с переменными границами в качестве членов структур

Содержание

С99 дает возможность в качестве последнего члена структуры указывать массив без размера. (В структуре перед гибким массивом-членом должен стоять как минимум еше один член.) Он называется членом-массивом с переменными границами. Таким образом, структура может иметь в качестве члена массив переменного размера. В размере такой структуры, возвращаемом sizeof, память для гибкого массива не учитывается.

Обычно память для структуры с членом-массивом с переменными границами распределяется автоматически, с помощью malloc(). Кроме размера структуры, необходимо еше выделить дополнительную память, чтобы разместить член-массив с переменными границами нужного размера. Например, если имеется следующее определение структуры

sturct mystruct {
  int a;
  int b;
  float fa[]; /массив с переменными границами
};

то при выполнении следующего кода будет выделяться место для массива из 10 элементов:

struct mystruct *p;
p = (struct mystruct *) malloc(sizof(struct mystuct) + 10 *
sizof(float);)

Так как sizeof (struct mystruct) дает значение, в котором не учтен размер памяти для fa, то при вызове malloc() с помощью выражения

10 *sizof(float)

дополнительно выделяется место для размещения массива из 10 элементов типа float.