Надо так:
void arr_cr( int ***a , int n, int m){
int i,j;
a*=(int **)malloc(n*sizeof(int *));
for( i=0 ; i < n ; i++)
(a*)[i]=(int *)malloc(m*sizeof(int));
}
У вас везде напутано - вы создаете n/10/10
int*
, а потом заполняете их циклом до m/8/12. Выделили 10 элементов, заполнили 8 или 12. Непорядок.
И когда вы выделяете память под строку массива в цикле, вы должны не
sizeof(int)
памяти выделять, а в m/8/12 раз больше - вы же под всю строку память выделять должны.
edit: еще не заметил, что массив передается по значению. Надо передавать int***.