Ci sono alcune cose inutili come

codice:
if (size2<1) return minimo;
size2 non raggiungerà mai valori minori di 1 in quella funzione, tra l'altro "minimo" non è inizializzata ad alcun valore in quel punto del codice.

Così dovrebbe andare senza istruzioni superflue

codice:
int min(int *array, int n)
{
    int min_val;

    if (n == 1) {
        return *array;
    }

    return (min_val = min(array, n - 1)) < array[n - 1] ? min_val : array[n - 1];
}