/* Declare and use a dynamic multidimensional array */
#include <stdio.h>
#include <stdlib.h>

/* Method 1: matrix as array */
void printm(int *m, int r, int c){
    int i, j;
    for(i=0; i<r; i++){
        for(j=0; j<c; j++)
            printf("%3d ", m[i*c+j]);
        printf("\n");
    }
}

int *cream(int r, int c){
    int i, j;
    int *m=malloc(sizeof(int)*r*c);
    for(i=0; i<r; i++){
        for(j=0; j<c; j++)
            m[i*c+j]=rand()%100;
    }
    return m;
}

void destroy(int *m){
    free(m);
}

int test(int r, int c){
    int *m=cream(r, c);
    printm(m, r, c);
    destroy(m);
    return 0;
}

/* Method 2: array of arrays */
int printma(int **m, int r, int c){
    int i, j;
    for(i=0; i<r; i++){
        for(j=0; j<c; j++)
            printf("%3d ", m[i][j]);
        printf("\n");
    }
}

int **creama(int r, int c){
    int i, j;
    int **m=malloc(sizeof(int *)*r);
    for(i=0; i<r; i++){
        m[i]=malloc(sizeof(int)*c);
        for(j=0; j<c; j++)
            m[i][j]=rand()%100;
    }
    return m;
}

void destroya(int **m, int r){
    int i;
    for(i=0; i<r; i++)
        free(m[i]);
    free(m);
}

int testa(int r, int c){
    int **m=creama(r, c);
    printma(m, r, c);
    destroya(m,r);
    return 0;
}
    



int main(){
    test(3,4);
    testa(4,3);
}
