Perchè complicarsi la vita utilizzando una struct costituita da un solo membro?
Secondo me o ricorri a qualcosa del genere:
typedef struct vettore_
{
int dim;
int *element;
} vettore;
oppure semplicemente ad un puntatore doppio a int, chiamiamolo v, oltre ovviamente ad un array dinamico, chiamiamolo dim, in cui andrai a salvare le dimensioni degli n array a lunghezza variabile.
Per quanto riguarda la parte sulle combinazioni, credo che la cosa più semplice sia quella di ricorrere ad un array, chiamiamolo u, costituito da n interi inizializzati a 0 che andranno a rappresentare gli indici della singola combinazione da stampare.
Esempio:
n = 3
dim = [2, 3, 4]
u:
0 0 0
0 0 1
0 0 2
0 0 3
0 1 0
0 1 1
0 1 2
0 1 3
0 2 0
0 2 1
0 2 2
0 2 3
1 0 0
1 0 1
1 0 2
1 0 3
1 1 0
1 1 1
1 1 2
1 1 3
1 2 0
1 2 1
1 2 2
1 2 3
e sono esattamente 2*3*4=24 combinazioni.
Implementare un algoritmo che consente una cosa del genere non è affatto difficile.
A quel punto l'array u potrà essere utilizzato per stampare la generica combinazione ricorrendo ad una funzione del tipo:
void stampa_combinazione(int **v, int *u, int n)
{
for(int i = 0; i < n; ++i)
{
printf("%d ", v[i][u[i]]);
}
printf("\n");
}
Se hai qualche dubbio chiedi pure.