Creo que tendrías que revisar esto:
Cita: int **matrix = ( int** ) malloc ( sizeof (int) * linhas * colunas );
malloc ( sizeof (int) * linhas * colunas ); va a reservar espacio en memoria para una cantidad (linhas * colunas) de ints, cuando en realidad deberías reservar esa misma cantidad (linhas * colunas) pero para punteros a int.
En una arquitectura donde ints y punteros a ints tienen el mismo tamaño (32 bits cada uno, por ejemplo) no habría diferencia, pero donde sizeof(int) != sizeof(int*) eso no va a andar. Entonces, tendría que ser
Cita: int** matrix = ( int** ) malloc ( sizeof (int*) * linhas * colunas );