Recursive max int in array
Never omit "optional" braces, as you did for your first if statement.  That's a bad habit that will eventually lead to a coding accident.  If you feel compelled to omit braces, then at least put the whole statement on the same line.

You should avoid unnecessary mutation, as you did with arr++.  This is  especially important with an exercise in recursion: it is one of the principles of functional-programming.

The curr_max parameter is annoying and unnecessary.  It also leads to a bug with negative array members, when a poorly selected initial value is chosen.  (You should use INT_MIN from &lt;limits.h&gt; instead of 0.)  Furthermore, your base case is questionable: is the maximum of a zero-length array well defined?

Suggested solution

#include &lt;assert.h&gt;

int max_val(int arr[], size_t length)
{
    assert(length &gt; 0);
    if (length == 1) return arr[0];
    int max_tail = max_val(arr + 1, length - 1);
    return arr[0] &gt; max_tail ? arr[0] : max_tail;
}