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;
}

void mat_mul(complex** a, complex** b, complex** c, int n, int m, int l)

{
int i, j, k;
complex s, t;

for (i = 0; i < n; i++)
for (j = 0; j < m; j++) {
s.re = s.im = 0.0;
for (k = 0; k < l; k++) {
t = mul(a[i][k], b[k][j]);
s = add(s, t);
}
c[i][j] = s;
}
}

void print_mat(complex** a,int n,int m,char *str)
{
int i, j;

printf("%s = \n", str);
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++)
printf("%+f + %+fi ", a[i][j].re, a[i][j].im);
printf("\n");
}
}
>>683
この様に変更してみました。
これ以下は以前のプログラムのままです。