С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.