Recursive matrix multiplication
You're allocating a new result matrix every time, then almost always throwing it away.  Only allocate one if the passed in c matrix is null.

Since you're recursion comes at the end (tail recursion), this could be changed over from recursion to a loop.  If your matrix is too large, the recursion depth will be too deep and you'll run out of stack space.  This won't happen with a loop.