Дана целочисленная матрица A(M,N). Характеристикой j –го столбца матрицы назовем значение элемента, который встречается максимальное число раз в j–ом столбце. Если таких элементов в строке несколько, то взять наименьший из них. Упорядочить столбцы матрицы по неубыванию характеристик. В программе предусмотреть динамическое выделение памяти.

У меня есть написанный код к этой задаче, только в ней не выделена динамическая память.

Код :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    srand( time( NULL ) );
    int a[100][100], b[100][2], N, M, i, j, t, k;
    printf("M= ");
    scanf("%d", &M);
    printf("N= ");
    scanf("%d", &N);
    printf("Ishodn matr:\n");
    for(i=0; i<M; i++)
    {
        for(j=0; j<N; j++)
        {
            a[i][j]=rand()%7;
            printf("%2d", a[i][j]);
        }
        printf("\n");
    }
    for(j=0; j<N; j++)
    {
        b[j][0]=a[0][j];
        b[j][1]=1;
        for(i=0; i<M; i++)
        {
            t=0;
            for(k=0; k<M; k++)
                if(a[i][j]==a[k][j])
                    t++;
            if(t>b[j][1] || (t==b[j][1] && b[j][0]>a[i][j]))
            {
                b[j][1]=t; b[j][0]=a[i][j];
            }
        }
    }
    for(j=0; j<N-1; j++)
    {
        t=j;
        for(i=j; i<N; i++)
            if(b[i][0]<b[t][0])
                t=i;
        for(i=0; i<M; i++)
        {
            k=a[i][j];
            a[i][j]=a[i][t];
            a[i][t]=k;
        }
        k=b[j][0]; b[j][0]=b[t][0]; b[t][0]=k;
    }
    printf("Preobr matr:\n");
    for(i=0; i<M; i++)
    {
        for(j=0; j<N; j++)
            printf("%2d", a[i][j]);
        printf("\n");
    }
    return 0;
}