#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef int T;

T** create(int N, int M)
{
    T** arr = (T**)malloc(2*sizeof(int)+N*(sizeof(T*)+M*sizeof(T)));
    *((int*)arr)   = N;
    *((int*)arr+1) = M;
    arr = (T**)((char*)arr+2*sizeof(int));

    for(int i = N, ofs = N*sizeof(T*);
        i-->0; ofs += M*sizeof(T))
        arr[i] = (T*)((char*)arr + ofs);

    return arr;
}

void kill(T** arr)
{
    free((char*)arr-2*sizeof(int));
}

int rows(T**arr)
{
    return *(int*)((char*)arr-2*sizeof(int));
}

int cols(T**arr)
{
    return *(int*)((char*)arr-sizeof(int));
}

void work(T**arr)
{
    for(int i = 0; i < rows(arr); ++i)
        for(int j = 0; j < cols(arr); ++j)
            arr[i][j] = 10*i+j;


    for(int i = 0; i < rows(arr); ++i)
    {
        for(int j = 0; j < cols(arr); ++j)
        {
            printf("%02d  ",arr[i][j]);
        }
        puts("");
    }
}

int main(int argc, const char * argv[])
{
    T** arr = create(5,8);
    work(arr);
    kill(arr);

    puts("");

    arr = create(8,5);
    work(arr);
    kill(arr);

}
