Я так понял - сперли откуда-то кусок кода, но понять, как это работает, тяму не хватает. Да и код-то фиговый.
int** inmatr(int m,int n){
int *matr;
int i,j;
if ((matr=(int*) сalloc(m * n, sizeof(int))) == NULL)
{
puts("Memory alloc error");
exit(100);
}
for (i=0; i<m; i++){
for (j=0;j<n;j++){
printf("a[%d][%d] = ", i, j);
scanf("%d", &matr[i][j]);
}
}
return &matr;
}
Проверка успешности выделения памяти делается банально просто - если память не выделена, целевая переменная равна NULL. Выделять память не только можно, но и нужно сразу - размер матрицы же известен сразу. Только разумеется не массив указателей на целое, а массив целых.
Возвращается адрес области, куда записали адрес области под матрицу. Хотя я бы передавал переменную (тип **int) из вызывающей функции.
Освобождается память через free(). Но освобождение невыделенной памяти может запросто привести к SIGSEGV.