>top = (double **)malloc(sizeof(double *) * M);
>top[0] = (double *)malloc(sizeof(double) *M*N);

これがやりたいのかなぁ
top = (double **)malloc(sizeof(double *) * M);
for (i = 0; i < M; i++)
  top[i] = (double *)malloc(sizeof(double) * N);