>>671
では、前者の方ということですね。
先程もいったようにn,m,lがコンパイル時に決定されないので、
当然、行列のサイズもコンパイル時にはわかりません。
そのため、malloc()を使って動的に行列を確保するようにします。

double** allocate(int n, int m)
{
 double** p;
 double* t;
 int i;

 p = (double**)malloc(sizeof(double*) * n + sizeof(double) * n * m);
 t = (double*)&p[n];
 for (i = 0; i < n; i++) {
  p[i] = &t[i * m];
 }
 return p;
}

とりあえずこれが下準備部分となります。