Для одномерных массивов вы можете сделать что-то вроде этого:
struct TEST {
...
int size;
char string[];
}
где поле размера указывает количество символов в строковом массиве. Массив должен быть последним членом структуры, и вы должны динамически распределять память структуры. В этом случае выделенный размер должен быть sizeof(struct TEST) + size * sizeof(char)
.
В структуре не может быть более одного массива переменного размера. Многомерные массивы переменного размера сложнее. Это невозможно сделать, если только один размер измерения неизвестен, в частности, размер первого измерения.
struct TEST {
...
int size;
char string[][100];
}
EDIT:
Как упоминалось в других постерах, вы можете иметь указатели на один или несколько массивов за счет необходимости управлять своими областями памяти отдельно от структуры.
РЕДАКТИРОВАТЬ 2:
Это часть, по крайней мере, стандарта ISO C99. Бесстыдное копирование из пункта 6.7.2.1, подпункт 16:
16 Как особый случай, последний элемент
структуры с более чем одним
указанный член может иметь неполный
тип массива; это называется гибким
член массива. С двумя исключениями,
член гибкого массива игнорируется.
Во-первых, размер структуры должен
быть равным смещению последнего
элемент в остальном идентичный
структура, которая заменяет гибкий
член массива с массивом
неопределенная длина.106) ...