Динамически менять количество просто так не получится. Возникнет переспределение памяти. Когда размера уже выделенного не хватает, придётся копировать старые в массив новой длины.
struct Y { int *z; } struct X { struct Y *y; }
struct X x; x.y=malloc(15*sizeof(struct Y)); x.y->z=malloc(15*sizeof(int));