Se poi vuoi realizzare davvero matrici a "dimensione variabile", come da titolo, allora non credo che si possa fare altro che ricorrere ad un array monodimensionale sfruttando però la conoscenza del fatto che l'allocazione in memoria di matrici n-dimensionali, in C, avviene per righe, cioè una matrice bidimensionale tipo
1 2 3
4 5 6
7 8 9
viene memorizzata come
1
2
3
4
5
6
7
8
9
quindi anche se si tratta di un array 2D è possibile gestirlo come se fosse monodimensionale. Stessa cosa sarebbe per array a più dimensioni.
Tempo fa scrissi un po' di codice per "uso personale", lo posto qui ma non ho curato alcun controllo e/o ottimizzazione, proprio perché non serviva praticamente a nulla. Tra l'altro sarebbe da migliorare la visualizzazione, che per ora non fa altro che mostrare tutte le sottomatrici 2D che costituiscono l'array n-dimensionale.
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
void my_alloc(int **x, int n)
{
*x = (int *) malloc ( n * sizeof(int) );
if ( *x == NULL ) {
fprintf(stderr, "Errore durante l'allocazione della memoria: %s\n", strerror(errno));
exit(errno);
}
}
void my_free(int **x)
{
free(*x);
*x = NULL;
}
int main(void)
{
int *x, i, j = 0,
*dimensioni, n_dim, size = 1,
m, mn;
printf("Immettere il numero delle dimensioni della matrice da generare: ");
scanf("%d", &n_dim);
my_alloc(&dimensioni, n_dim);
printf("Per ogni dimensione, immetterne la lunghezza...\n");
for ( i = 0; i < n_dim; i++ ) {
printf("Dimensione %d\n", i);
scanf("%d", dimensioni + i);
size *= dimensioni[i];
}
m = dimensioni[0];
if ( n_dim > 1 )
mn = m*dimensioni[1];
my_alloc(&x, size);
for ( i = 0; i < size; i++ )
x[i] = rand() % 100;
for ( i = 0; i < size; i++ ) {
if ( ! (i % mn) ) {
printf("\n\nMatrice: %d\n", j);
j++;
}
if ( ! (i % m) )
putchar('\n');
printf("%2d ", x[i]);
}
puts("\n\n");
my_free(&x);
my_free(&dimensioni);
return 0;
}