Non vedo dove inizializzi m, l'hai inizializzato? Se l'hai fatto dovrebe essere ok, altrimenti forse c'e' qualche altro errore di allocazione nel programma, il bello della malloc e' che magari non fallisce quando fai un errore, ma due o tre chiamate dopo .....

Orpo pero' , sembra quel codice scritto per le gare di programmazione, dove vince chi scrive le cose + incomprensibili e allora le variabili si chiamarno _zz , __w eccetera..

ho scritto questa prova a vedere se funzia dovrebbe essere + efficiente

codice:
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>

...
//VAR DI APPOGGIO
  size_t i=0, m=5, n=5, sz=sizeof(double);
  char ** ptr;
  char* bp; 	
  double**B;
....

  if(!(ptr=(char**)malloc(sizeof(void*)*n + sz*n*m))) exit(0);
  bp = (char*)ptr + sizeof(void*)*n;
  sz*=m,memset(bp, 0, sz*n);
  while(n-->0)ptr[n] = bp + sz*n;	
  B = (double**)ptr;
  for(;i<m;++i)mtx[i][i]=1.0;	
...
Ciao